我正在使用 numpy 的 ndarray 来表示灰度图像。我正在尝试根据阈值将一些像素值更改为黑色或白色。第一个实现如下:
bwImage = image #ndArray
for h in range(image.shape[0]):
for w in range(image.shape[1]):
if image[h][w] > threshold:
bwImage[h][w] = 0
else:
bwImage[h][w] = 255
cv2.imwrite('testImg.jpg', bwImage)
当我将数组写入 testImg.jpg 时,我看到了原始图像。然后我遍历 ndArray 以检查值是否实际更改。
bwImage = image
for h in range(image.shape[0]):
for w in range(image.shape[1]):
if image[h][w] > threshold:
bwImage[h][w] = 0
else:
bwImage[h][w] = 255
#why does this have to be here to convert it to BW?
for h in range(image.shape[0]):
for w in range(image.shape[1]):
print image[h][w]
cv2.imwrite('testImg.jpg', bwImage)
然后将图像保存为黑白。这是为什么?
我还尝试执行以下操作:
image[image <= threshold] = 255
image[image > threshold] = 0
cv2.imwrite('testImg.jpg', bwImage)
根据哪个语句首先确定图像的保存是全黑还是全白。有什么想法吗?
最佳答案
方法一
我尝试了没有打印语句的第一个代码片段,它工作得很好(使用 cv2 版本 3.0.0,numpy 1.9.2)。然而需要注意的两件事是
bwImage = image
不复制图像,它只是创建另一个指向图像的指针 -> 所有对 bwImage
的修改就地完成初始image
方法二
这里的问题是,因为您正在就地进行反向阈值处理,所以您的第一个分配将所有小于阈值的值设置为 255 就地。然后,您的第二个分配将所有超过阈值(现在包括所有内容)的值分配给黑色。
如果您想做一个非倒置阈值,只需切换运算符即可完成:
image[image > threshold] = 255
image[image <= threshold] = 0
如果您想像 中那样进行倒置阈值处理方法一 ,您必须复制图像,然后您可以将原始图像用作蒙版,而不会破坏原始像素信息:
image_copy = image.copy()
image_copy[image <= threshold] = 255
image_copy[image > threshold] = 0
cv2.imshow('image',image_copy)
关于python - 为什么图像值不会根据阈值改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32217532/