如何将灰度OpenCV图像转换为黑白图像?我看到已经询问了similar question,但我使用的是OpenCV 2.3,建议的解决方案似乎不再起作用。

我正在尝试将灰度图像转换为黑白图像,以使不是绝对黑色的任何东西都是白色,并将其用作surf.detect()的蒙版,以便忽略在黑色蒙版区域边缘上发现的关键点。

下面的Python几乎可以解决我的问题,但是发送到Threshold()的阈值似乎没有任何作用。如果将其设置为0或16或128或255,则结果是相同的,所有值> 128的像素都将变为白色,其他所有像素都将变为黑色。

我究竟做错了什么?

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

最佳答案

使用新的cv2 Python绑定(bind),与您所引用的答案类似的分步答案:

1.读取灰度图像

import cv2
im_gray = cv2.imread('grayscale_image.png', cv2.IMREAD_GRAYSCALE)

2.将灰度图像转换为二进制
(thresh, im_bw) = cv2.threshold(im_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

使用Otsu的方法从图像自动确定阈值,或者如果您已经知道阈值,则可以使用:
thresh = 127
im_bw = cv2.threshold(im_gray, thresh, 255, cv2.THRESH_BINARY)[1]

3.保存到磁盘
cv2.imwrite('bw_image.png', im_bw)

10-06 09:44