将灰度图像中的像素转换为黑色(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)会导致意外结果?的主要内容,如果未能解决你的问题,请参考以下文章