为什么图像值不随阈值变化

2024-06-01 02:27:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是来自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)

当我将数组写入测试mg.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)

根据首先使用的语句确定图像的保存是完全黑色还是白色。有什么想法吗?你知道吗


Tags: toin图像imageforthresholdrangecv2
1条回答
网友
1楼 · 发布于 2024-06-01 02:27:55

方法1

我尝试了没有print语句的第一段代码,它运行得很好(使用cv2版本3.0.0,numpy 1.9.2)。但有两件事需要注意

  1. bwImage = image不复制映像,它只是创建另一个指向映像的指针->;对bwImage的所有修改都在初始image的位置上完成
  2. 生成的图像与原始灰度图像“反转”,因为低于阈值(暗)时指定高值(白色),反之亦然

方法2

这里的问题是,因为您正在原地执行反转阈值,所以您的第一个赋值将所有小于阈值的值设置为255。然后,您的第二个赋值将超过阈值(现在包括所有内容)的所有值赋给black。你知道吗

如果要执行非反转阈值,只需切换运算符即可完成:

image[image > threshold] = 255
image[image <= threshold] = 0

如果要像方法1中那样执行反转阈值,则必须复制图像,然后可以将原始图像用作遮罩,而不破坏原始像素信息:

image_copy = image.copy()
image_copy[image <= threshold] = 255
image_copy[image > threshold] = 0
cv2.imshow('image',image_copy)

相关问题 更多 >