【问题标题】:how to make my code identify the difference between 2 circles (2 circles one filled with white and one with black) using python and pillow?如何让我的代码使用 python 和枕头识别 2 个圆圈(2 个圆圈,一个用白色填充,一个用黑色填充)之间的区别?
【发布时间】:2019-06-14 23:35:53
【问题描述】:

我有 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")

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

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

【问题讨论】:

    标签: python python-imaging-library


    【解决方案1】:

    好吧,如果您只想在图像中进行边缘检测,那么您可以尝试使用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程序处理后的输出:-

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

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

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

    由于圆的尺寸相同,将它们通过边缘检测过程会得到相同的结果。

    注意:-

    • 在问题中,您希望圆形边缘为白色,其余部分 部分灰度。这不是边缘检测的最佳选择。 白色和黑色彼此相反,因此边缘可能是 如果图像的样本空间由这些组成,则很容易识别 两种颜色。即使这样,如果您想要灰度而不是黑色,那么您可以简单地将图像的每个黑色像素更改为灰色像素,或者满足您的需求
    • 上述边缘检测的结果是相同的,因为边缘的大小 边界可以忽略不计。如果边框更宽(笔画),那么当 这个过程是在一个带有黑色边框的白色圆圈上完成的,边缘 检测将创建一个以上的白色边框。你可以通过 这个问题,通过让程序忽略内部边缘并且只 考虑到最外层的。

    【讨论】:

    • 我今天会尝试并反馈给你我猜我的方法中的错误是没有将它们转换为 RGB ^^ 谢谢你的可爱解释
    • 你知道一种方法来忽略圆圈的填充,如果它被剥离(1 个白色圆圈)(1 个被剥离的圆圈)我只想得到外框的边缘,但忽略里面的内容
    • @HussienEl-Sawy Reading this 一定会引导您实现您想要实现的目标。即使它在cv2 中,但您仍然可以很容易地创建它的 PIL 等价物
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 2021-09-23
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多