user9687180
user9687180

Reputation:

Setting pixels values in OpenCV Python

How fast change pixels values? In C# what i need to do is only use GetPixel() to get pixel value and SetPixel() to change it (its pretty easy to use but slow, MarshallCopy and Lock/UnlockBits is much faster).

In this code, i marking black pixels as 1 and white pixels as 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

In c#, it can looks like this:

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);

In the next step i will marking countour pixels as "2", but now i want to ask you, how to set new image in python from my specific value and then, display it? For experimental purpose, i want to invert image (from B&W to W&B) only by byte valuse. Can you help me how to do it?

EDIT1

I think i found a solution, but i have GREYSCALE image with one channel (i think thats how it works when i using cv2.cvtColor to convert 3 channels image to greyscale image). The function like this:

im[np.where((im == [0,0,0]).all(axis = 2))] = [0,33,166]

Could work pretty well, but how to make that function work with greyscale image? I want to set some black pixels (0) into White (255)

Upvotes: 0

Views: 5244

Answers (1)

Jeru Luke
Jeru Luke

Reputation: 21203

For a single channel image (gray scale image) use the following:

First create a copy of the gray image:

gray_2 = gray.copy()

Now assign black pixels to be white:

gray_2[np.where(gray == 0)] = 255

Upvotes: 3

Related Questions