Преобразование RGB в черный или белый
Как мне взять RGB-изображение в Python и преобразовать его в черный или белый? Не в оттенках серого, я хочу, чтобы каждый пиксель был полностью черным (0, 0, 0) или полностью белым (255, 255, 255).
Есть ли встроенная функциональность для этого в популярных библиотеках обработки изображений Python? Если нет, лучше всего будет просто пропустить каждый пиксель, если он ближе к белому, установите его на белый, если он ближе к черному, установите его на черный?
Ответы
Ответ 1
Масштабирование до черного и белого
Преобразовать в оттенки серого, а затем масштабировать до белого или черного (в зависимости от того, что ближе).
Оригинал:
![meow meow tied up cat]()
Результат:
![Black and white Cat, Pure]()
Реализация чистого подушки
Установите pillow
, если вы еще этого не сделали:
$ pip install pillow
Pillow (или PIL) может помочь вам эффективно работать с изображениями.
from PIL import Image
col = Image.open("cat-tied-icon.png")
gray = col.convert('L')
bw = gray.point(lambda x: 0 if x<128 else 255, '1')
bw.save("result_bw.png")
В качестве альтернативы вы можете использовать Pillow с numpy.
Подушка + Нисходящий битмаски Подход
Вам нужно установить numpy:
$ pip install numpy
Для работы Numpy нужна копия массива, но результат тот же.
from PIL import Image
import numpy as np
col = Image.open("cat-tied-icon.png")
gray = col.convert('L')
# Let numpy do the heavy lifting for converting pixels to pure black or white
bw = np.asarray(gray).copy()
# Pixel range is 0...255, 256/2 = 128
bw[bw < 128] = 0 # Black
bw[bw >= 128] = 255 # White
# Now we put it back in Pillow/PIL land
imfile = Image.fromarray(bw)
imfile.save("result_bw.png")
Черное и белое с использованием подушки с сглаживанием
Используя Pillow, вы можете преобразовать его прямо в черно-белое. Будет похоже, что у него оттенки серого, но ваш мозг обманывает вас! (Черно-белые рядом друг с другом выглядят серыми)
from PIL import Image
image_file = Image.open("cat-tied-icon.png") # open colour image
image_file = image_file.convert('1') # convert image to black and white
image_file.save('/tmp/result.png')
Оригинал:
![meow meow color cat]()
Converted:
![meow meow black and white cat]()
Черно-белое использование подушки без сглаживания
from PIL import Image
image_file = Image.open("cat-tied-icon.png") # open color image
image_file = image_file.convert('1', dither=Image.NONE) # convert image to black and white
image_file.save('/tmp/result.png')
Ответ 2
Я бы предложил преобразовать в оттенки серого, а затем просто применил порог (наполовину, или средний или меадианский, если вы так выбираете).
from PIL import Image
col = Image.open('myimage.jpg')
gry = col.convert('L')
grarray = np.asarray(gry)
bw = (grarray > grarray.mean())*255
imshow(bw)
Ответ 3
img_rgb = cv2.imread('image.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
(threshi, img_bw) = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
Ответ 4
Подушка с сглаживанием
Используя pillow, вы можете преобразовать его прямо в черно-белое. Будет похоже, что у него оттенки серого, но ваш мозг обманывает вас! (Черно-белые рядом друг с другом выглядят серыми)
from PIL import Image
image_file = Image.open("cat-tied-icon.png") # open colour image
image_file = image_file.convert('1') # convert image to black and white
image_file.save('/tmp/result.png')
Оригинал:
![meow meow color cat]()
Converted:
![meow meow black and white cat]()
Ответ 5
И вы можете использовать colorsys
(в стандартной библиотеке) для преобразования rgb в hls и использовать значение яркости для определения черного/белого
import colorsys
# convert rgb values from 0-255 to %
r = 120/255.0
g = 29/255.0
b = 200/255.0
h, l, s = colorsys.rgb_to_hls(r, g, b)
if l >= .5:
# color is lighter
result_rgb = (255, 255, 255)
elif l < .5:
# color is darker
result_rgb = (0,0,0)
Ответ 6
Используя opencv Вы можете легко конвертировать RGB в двоичное изображение
import cv2
%matplotlib inline
import matplotlib.pyplot as plt
from skimage import io
from PIL import Image
import numpy as np
img = io.imread('http://www.bogotobogo.com/Matlab/images/MATLAB_DEMO_IMAGES/football.jpg')
img = cv2.cvtColor(img, cv2.IMREAD_COLOR)
imR=img[:,:,0] #only taking gray channel
print(img.shape)
plt.imshow(imR, cmap=plt.get_cmap('gray'))
#Gray Image
plt.imshow(imR)
plt.title('my picture')
plt.show()
#Histogram Analyze
imgg=imR
hist = cv2.calcHist([imgg],[0],None,[256],[0,256])
plt.hist(imgg.ravel(),256,[0,256])
# show the plotting graph of an image
plt.show()
#Black And White
height,width=imgg.shape
for i in range(0,height):
for j in range(0,width):
if(imgg[i][j]>60):
imgg[i][j]=255
else:
imgg[i][j]=0
plt.imshow(imgg)
Ответ 7
Вот код для создания двоичного изображения с использованием opencv-python:
img = cv2.imread('in.jpg',2)
ret, bw_img = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
cv2.imshow("Output - Binary Image",bw_img)