Для изображения с одним каналом (изображение с серой шкалой) используйте следующее:
Сначала создайте копию серого изображения:
gray_2 = gray.copy()
Теперь назначьте черные пиксели белыми:
gray_2[np.where(gray == 0)] = 255
Как быстро меняются значения пикселей? В C # мне нужно только использовать, GetPixel()
чтобы получить значение пикселя и SetPixel()
изменить его (его довольно простой в использовании, но медленный, MarshallCopy и Lock / UnlockBits намного быстрее).
В этом коде я отмечаю черные пиксели как 1 и белые пиксели как 0
import tkFileDialog
import cv2
import numpy as np
from matplotlib import pyplot as plt
path = tkFileDialog.askopenfilename()
bmp = cv2.imread(path) #reading image
height, width, channels = bmp.shape
if channels == 3:
bmp = cv2.cvtColor(bmp, cv2.COLOR_BGR2GRAY) #if image have 3 channels, convert to BW
bmp = bmp.astype('uint8')
bmp = cv2.adaptiveThreshold(bmp,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY,11,2) #Otsu thresholding
imageData = np.asarray(bmp) #get pixels values
pixelArray = [[0 for y in range(height)] for x in range(width)] #set size of array for pixels
for y in range(len(imageData)):
for x in range(len(imageData[0])):
if imageData[y][x] == 0:
pixelArray[y][x] = 1 #if black pixels = 1
else:
pixelArray[y][x] = 0 #if white pixels = 0
В c # он может выглядеть так:
for (y = 0; y < bmp.Height-1; y++)
{
for (x = 0; x < bmp.Width-1; x++)
{
if (pixelArray[y, x] == 1)
newImage.SetPixel(x, y, Color.Black); //printing new bitmap
else
newImage.SetPixel(x, y, Color.White);
}
}
image2.Source = Bitmap2BitmapImage(newImage);
На следующем шаге я буду отмечать пиксели countour как «2», но теперь я хочу спросить вас, как установить новое изображение в python с моего определенного значения, а затем отобразить его? Для экспериментальной цели я хочу инвертировать изображение (от B & W до W & B) только байт-валузой. Можете ли вы помочь мне, как это сделать?
EDIT1
Я думаю, что нашел решение, но у меня есть изображение GREYSCALE с одним каналом (я думаю, что это работает, когда я использую cv2.cvtColor
для преобразования изображения с 3 каналами в изображение в оттенках серого). Функция вроде этого:
im[np.where((im == [0,0,0]).all(axis = 2))] = [0,33,166]
Может работать очень хорошо, но как заставить эту функцию работать с полутоновым изображением? Я хочу установить некоторые черные пиксели (0) в белый (255)