python:opencv比较直方图结果

Posted

技术标签:

【中文标题】python:opencv比较直方图结果【英文标题】:python: opencv comparing histograms wird results 【发布时间】:2018-10-19 14:44:30 【问题描述】:

我正在使用内置的opencv 函数打开图像,删除背景,裁剪图像,然后计算文件的直方图,将其与不同文件的直方图进行比较。

为了比较直方图,我使用 BGR 颜色空间和函数: cv2.compareHist(hist_1, hist_2, cv2.HISTCMP_CORREL)

我的代码是

def cv_histogram(image, channels=[0, 1, 2], hist_size=[10, 10, 10], hist_range=[0, 256, 0, 256, 0, 256], hist_type='BGR'):
    #convert to different color space if needed
    if hist_type=='HSV':    image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    elif hist_type=='GRAY': image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    elif hist_type=='RGB':  image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

    image_hist = cv2.calcHist([image], channels, None, hist_size, hist_range)
    image_hist = cv2.normalize(image_hist, image_hist).flatten()
    return image_hist

def cv_compare_images_histogram(img_base, img_compare, method='correlation'):
    hist_1 = cv_histogram(img_base)
    hist_2 = cv_histogram(img_compare)

    if method == "intersection":
        comparison = cv2.compareHist(hist_1, hist_2, cv2.HISTCMP_INTERSECT)
    else:
        comparison = cv2.compareHist(hist_1, hist_2, cv2.HISTCMP_CORREL)
    return comparison

im1 = image_remove_background(cv2.imread("1.jpg"), bg_lower_bgr, bg_upper_bgr)
im2 = image_remove_background(cv2.imread("2.jpg"), bg_lower_bgr, bg_upper_bgr)
sim = cv_compare_images_histogram(im1, im2)
img_new = image_stack(im1, im2)
cv2.imshow('img_new', img_new)
print("Histogram similarity is: ", sim)

如下面的屏幕所示,图像具有不同的颜色/对象,但我收到了非常高的相关性:0.9198019904818888

脚本适用于大多数文件,知道为什么会有如此连线的结果吗?

【问题讨论】:

请校对您的帖子并修正源代码示例的缩进。 (我猜在我写它的时候,某个好心人为你做了)。 【参考方案1】:

在为这两个图像创建视觉直方图并进行更多调查后,问题是,在移除背景(替换为黑色像素)之后,具有黑色像素 [0,0,0] 的像素出现了巨大的峰值,并且具有 bin 大小-10,导致非常高的相关性。

为了解决问题,我必须创建没有黑色像素的直方图,方法是将它们从直方图范围中删除:hist_range=[1, 256, 1, 256, 1, 256]

【讨论】:

您是否尝试计算灰度图像的直方图然后进行比较? @FäridAlijani 解决了我从计算中删除“黑色像素”的问题

以上是关于python:opencv比较直方图结果的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 直方图比较

OpenCV-Python实战——直方图均衡化(含大量示例,建议收藏)

OpenCV之图像直方图比较

OpenCV图像增强(python)

Python 大白从零开始 OpenCV 学习课-6. 灰度变换与直方图处理

OpenCV实战——使用直方图比较相似图像