基于alpha-lay的PNG图像OpenCV边缘检测

2024-09-19 07:01:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个logo的以下图像,这是一个带有alpha(透明度)通道的PNG文件。logo的格式非常常见,但以下是路透社的logo示例:

enter image description here

我在Python中使用OpenCV Canny edge detection将其转换为单色边缘模板,可用于匹配更大的图像:

import matplotlib.pyplot as plt
import cv2
img = cv2.imread(filepath) # Save above image and add location here
img_edged = cv2.Canny(img, 100, 200)

不幸的是,这是拾取了标志周围的矩形边界,它被alpha通道遮住了:

^{pr2}$

enter image description here

我尝试过以下建议,在回复this question时提到,但它并不能解决这个问题:

img = cv2.imread(filepath, cv2.IMREAD_UNCHANGED)

(使用imshow确实可以使图像正确显示,但cv2.Canny仍会在徽标周围拾取隐藏的“框”。)

有没有一种预处理图像的方法来避免这个问题?在


Tags: 文件图像importalpha示例imgpng格式
2条回答

对于示例中的简单徽标,其中值得查找的所有边都位于前景和背景之间,透明遮罩包含您需要的所有信息:

 mask = source[:,:,3]

您可以查找mask的边缘,并找到路透社徽标中的所有边缘。我认为这对大多数的logo来说是正确的,但是有些可能更复杂。在

问题已解决,使用在StackOverflow上其他地方发现的此函数(已丢失指向问题的链接-如果找到请添加注释):

def remove_transparency(source, background_color):
    print(source.shape)
    source_img = cv2.cvtColor(source[:,:,:3], cv2.COLOR_BGR2GRAY)
    source_mask = source[:,:,3]  * (1 / 255.0)

    background_mask = 1.0 - source_mask

    bg_part = (background_color * (1 / 255.0)) * (background_mask)
    source_part = (source_img * (1 / 255.0)) * (source_mask)

    return np.uint8(cv2.addWeighted(bg_part, 255.0, source_part, 255.0, 0.0))

上述问题可以解决如下:

^{pr2}$

给予:

enter image description here

相关问题 更多 >