Python,OpenCV进行直方图反投影

Posted 程序媛一枚~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python,OpenCV进行直方图反投影相关的知识,希望对你有一定的参考价值。

Python,OpenCV进行直方图反投影

这篇博客将介绍Python,OpenCV中的直方图反投影。直方图反投影用于图像分割或在图像中查找感兴趣的对象。 简单地说,它创建了一个与输入图像大小相同(但只有一个通道)的图像,其中每个像素对应于该像素属于感兴趣对象的概率。输出图像将使感兴趣的对象比其余部分更白。如提取图像中的地面;

颜色直方图优于灰度直方图,因为物体的颜色比灰度强度更好地定义物体。

1. 效果图

如下官方的提取地面的效果图如下:
在这里插入图片描述

2. 源码

import cv2
import numpy as np

# ROI是感兴趣区域
roi = cv2.imread('rose_red.png')
hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)

# 需要寻找的ROI对象
target = cv2.imread('rose.png')
hsvt = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)

# 计算ROI对象的直方图 cv.calcHist  np.histogram2d np.binscount
roihist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])

# 直方图均衡化,并应用反投影
cv2.normalize(roihist, roihist, 0, 255, cv2.NORM_MINMAX)
dst = cv2.calcBackProject([hsvt], [0, 1], roihist, [0, 180, 0, 256], 1)

# 用椭圆进行卷积
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
cv2.filter2D(dst, -1, disc, dst)

# 阈值化并使用按位与
ret, thresh = cv2.threshold(dst, 50, 255, 0)
thresh = cv2.merge((thresh, thresh, thresh))
res = cv2.bitwise_and(target, thresh)

res = np.vstack((target, thresh, res))
cv2.imwrite('res.jpg', res)

参考

以上是关于Python,OpenCV进行直方图反投影的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV实战——基于反向投影直方图检测图像内容

OpenCV实战——基于反向投影直方图检测图像内容

OpenCV竟然可以这样学!成神之路终将不远(二十五)

OpenCV之图像直方图反向投影

OpenCV 直方图反向投影

OpenCv 020---图像直方图反向投影