我有2张图片,

1-白色圆圈,带有黑色笔触

2-黑色圆圈,带有黑色笔触

我想比较两个图像并确定两个图像具有相同的圆圈但填充不同
我应该只用python和枕头

我已经尝试了几种方法,例如边缘检测,但是每当尝试重新设置图片以进行边缘检测时,新图像就会显示为空白

from PIL import Image, ImageDraw
import numpy as np
from math import sqrt

# Load image:
input_image = Image.open("input.png")
input_pixels = input_image.load()
width, height = input_image.width, input_image.height

# Create output image
output_image = Image.new("RGB", input_image.size)
draw = ImageDraw.Draw(output_image)

# Convert to grayscale
intensity = np.zeros((width, height))
for x in range(width):
    for y in range(height):
        intensity[x, y] = sum(input_pixels[x, y]) / 3

# Compute convolution between intensity and kernels
for x in range(1, input_image.width - 1):
    for y in range(1, input_image.height - 1):
        magx = intensity[x + 1, y] - intensity[x - 1, y]
        magy = intensity[x, y + 1] - intensity[x, y - 1]

        # Draw in black and white the magnitude
        color = int(sqrt(magx**2 + magy**2))
        draw.point((x, y), (color, color, color))

output_image.save("edge.png")


预期的结果是,两张图片都将被灰度化,只有圆圈边缘标记为白色

实际结果为空的黑色图像(好像看不到边缘)

最佳答案

好吧,如果您想要的只是图像中的边缘检测,那么您可以尝试使用Sobel Operator或其等效项。

from PIL import Image, ImageFilter

image = Image.open(r"Circle.png").convert("RGB")
image = image.filter(ImageFilter.FIND_EDGES)
image.save(r"ED_Circle.png")


上面的代码接收输入图像,并将其转换为RGB模式(某些图像具有P模式,该模式不允许边缘检测,因此转换为RGB)。然后通过image.filter(ImageFilter.FIND_EDGES)查找边缘。

示例输入图像(带有黑色圆圈的黑色边框):-

python - 如何使我的代码使用python和枕头识别2个圆(2个圆用白色填充,一个用黑色填充)之间的区别?-LMLPHP

通过python程序处理后的输出:-

python - 如何使我的代码使用python和枕头识别2个圆(2个圆用白色填充,一个用黑色填充)之间的区别?-LMLPHP

示例图片2(带有黑色边框的白色圆圈):-

python - 如何使我的代码使用python和枕头识别2个圆(2个圆用白色填充,一个用黑色填充)之间的区别?-LMLPHP

通过python程序处理后的输出:-

python - 如何使我的代码使用python和枕头识别2个圆(2个圆用白色填充,一个用黑色填充)之间的区别?-LMLPHP

在上面的示例中,两个输入图像的大小相同,并且其中的圆圈也具有相同的尺寸,两者之间的唯一区别是,一个图像在黑色边框内有一个白色的圆圈,另一个图像有一个黑色边框内的黑色圆圈。

由于圆的尺寸相同,因此通过边缘检测过程可以得到相同的结果。

注意:-


在问题中,您想要用白色绘制圆形边缘,其余
灰度的一部分。这不是边缘检测的最佳选择。
白色和黑色彼此相反,因此边缘可能是
如果图像的样本空间包含以下内容,则很容易识别
两种颜色。即使这样,如果您想要灰度而不是黑色,那么您可以简单地将图像的每个黑色像素更改为灰色像素,或者满足您需求的某种像素
以上边缘检测的结果是相同的,因为
边界可以忽略不计。如果边框较宽(中风),则当
该过程在带有黑色边框,边缘的白色圆圈上完成
检测将创建多个白色边框。你可以通过
通过使程序忽略内部边缘而仅
考虑到最外面的。

关于python - 如何使我的代码使用python和枕头识别2个圆(2个圆用白色填充,一个用黑色填充)之间的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56606183/

10-12 19:25