我有2张图片
1-白色圆圈,带有黑色笔划
2-黑色圆圈和黑色描边
我想比较两个图像并确定两个图像具有相同的圆圈但填充不同 我应该只使用python&pillow
我已经尝试了多种方法,例如“边缘检测”,但是每当我尝试对图片进行边缘检测时,新图像就会显示为空白
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")
预期结果是两张图片都将被灰度化,只有圆边标记为白色
实际结果为空的黑色图像(好像看不到边缘)
答案 0 :(得分:2)
好吧,如果您想要的只是图像中的边缘检测,那么您可以尝试使用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程序处理后的输出:-
在上面的示例中,两个输入图像的大小均相同,并且其中的圆圈也具有相同的尺寸,两者之间的唯一区别是,一个图像的黑色边框内有一个白色的圆圈,而另一个在黑色边框内有一个黑色圆圈。
由于圆的尺寸相同,因此将它们通过边缘检测过程会得到相同的结果。
注意:-