将灰度图像中的像素转换为黑色(OpenCV)会导致意外结果?

Posted

技术标签:

【中文标题】将灰度图像中的像素转换为黑色(OpenCV)会导致意外结果?【英文标题】:Converting pixels in grayscale image to black (OpenCV) causes unexpected result? 【发布时间】:2018-03-02 18:59:27 【问题描述】:

我正在尝试手动屏蔽图像,以便仅显示图像的圆形区域。我试图通过指定圆的中心和半径来实现这一点——从中心到图像中每个像素的距离,如果该距离大于半径,我将该像素变为黑色。

我的输入图像全为白色(用于测试目的),大小为 6000x4000 像素。 中心为 (3224,2032),半径为 1810 像素。

处理后,我得到了这个遮罩很差的图像

这里,蓝色圆圈是我预计不会改变的区域:Expected Result

发生了什么事??

编辑:我切换了 xMax 和 yMax 的索引。改变产生了这个结果

import cv2
def mask (img, Xcenter, Ycenter, radius):
    radius2 = float(radius**2.00)
    Xcenter = float(Xcenter)
    Ycenter = float(Ycenter)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    imgSize = img.shape
    xMax = imgSize[0]
    yMax = imgSize[1]

    print("Drawing mask...")

    for y in range(1,yMax):
        for x in range(1,xMax):
            dist2 = int(((x - Xcenter)**2 + (y - Ycenter)**2))
            try:
                if dist2 >= radius2:
                    img[x, y] = 0
            except IndexError:
                pass
                #print ("Index error: X = ", x, " Y = ", y)
                #char = input("Press enter to continue")
    cv2.imwrite("maskedImg.tif", img)
    print("Completed mask.")
    return img

【问题讨论】:

【参考方案1】:

.shape 返回图像的行数/列数/通道数。

.size 返回像素数。

这些很可能会有所不同,因此当您使用圆形函数引用像素时,它们不会像您预期的那样排列。

【讨论】:

imgSize 是我的变量,定义为 img.shape。这是多余的,但我更喜欢大小而不是形状。 您传递的半径变量是否以像素为单位?因为 xMax 和 yMax 值将是任意整数。您的图像可能是 6000x4000 像素,但仅包含 600x400 行/列(不确定实际数字可能是多少)。因此,当您比较 dist2 >= radius2 时,您实际上并不是在比较像素与像素。 半径也以像素为单位。我也看不出 x 和 yMax 是如何任意的——它们代表图像的形状。类似于在 Photoshop 中创建新文件时如何指定画布大小。【参考方案2】:

您似乎混淆了 x 和 y。 “行”的数量是 Y,所以

yMax = imgSize[0]
xMax = imgSize[1]

请记住,点 (0,0) 位于左上角。 另外,为了测试,我建议先把你的圈子放在中间。这并不重要,但有时您可以在图片中更轻松地调试这些东西。

【讨论】:

我尝试了许多 x 和 y 的组合来尝试修复它,但没有任何效果达到我想要的效果。我尝试了您的建议-我将生成的图像放在原始问题中。在该图像中,右侧的白条是我放过的索引错误。 嗯,切换那些已经旋转了你的黑色背景。切换 Xcenter 和 Ycenter 怎么样(其余代码与原始问题相同)?它把圆心(0,0)放在哪里? 你快到了,因为你有一个圆形。我认为,如果您查看中心为 (0,0) (3000,0)、(0,2000) 和 (6000,4000) 的圆圈,您可能可以修复它。

以上是关于将灰度图像中的像素转换为黑色(OpenCV)会导致意外结果?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV - 从图像中获取灰度值

在 OpenCV python 中将白色像素转换为黑色

如何使用带有c ++的opencv库将下图中的黑色像素更改为红色像素

将RGB转换为黑色或白色

如何区分二值图像和灰度图像?

使用OpenCV如何获取图像每个像素的灰度值??