["python","image-processing","opencv","computer-vision"]
Converting an OpenCV Image to Black and White

How do you convert a grayscale OpenCV image to black and white? I see a similar question has already been asked, but I'm using OpenCV 2.3, and the proposed solution no longer seems to work. I'm trying to convert a greyscale image to black and white, so that anything not absolutely black is white, and use this as a mask for surf.detect(), in order to ignore keypoints found on the edge of the black mask area. The following Python gets me almost there, but the threshold value sent to Threshold() doesn't appear to have any effect. If I set it to 0 or 16 or 128 or 255, the result is the same, with all pixels with a value > 128 becoming white, and everything else becoming black. What am I doing wrong? import cv, cv2 fn = 'myfile.jpg' im_gray = cv2.imread(fn, cv.CV_LOAD_IMAGE_GRAYSCALE) im_gray_mat = cv.fromarray(im_gray) im_bw = cv.CreateImage(cv.GetSize(im_gray_mat), cv.IPL_DEPTH_8U, 1); im_bw_mat = cv.GetMat(im_bw) threshold = 0 # 128#255# HAS NO EFFECT!?!? cv.Threshold(im_gray_mat, im_bw_mat, threshold, 255, cv.CV_THRESH_BINARY | cv.CV_THRESH_OTSU); cv2.imshow('', np.asarray(im_bw_mat)) cv2.waitKey()
Step-by-step answer similar to the one you refer to, using the new cv2 Python bindings: 1. Read a grayscale image import cv2 im_gray = cv2.imread('grayscale_image.png', cv2.IMREAD_GRAYSCALE) 2. Convert grayscale image to binary (thresh, im_bw) = cv2.threshold(im_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) which determines the threshold automatically from the image using Otsu's method, or if you already know the threshold you can use: thresh = 127 im_bw = cv2.threshold(im_gray, thresh, 255, cv2.THRESH_BINARY)[1] 3. Save to disk cv2.imwrite('bw_image.png', im_bw)