python-opencv Tutorials 一码人翻译(26)图像处理---- --直方图----直方图投影

目标

在这一章中,我们将学习直方图反投影。

理论

这是由Michael j.Swain,Dana h.巴拉德在他们的论文索引中通过颜色直方图提出的。

用简单的话来说是什么?它用于图像分割或在图像中寻找感兴趣的对象。简而言之,它创建的图像大小与我们的输入图像一样大小(但单个通道),其中每个像素对应于属于我们对象的那个像素的概率。在更简单的世界中,与剩余部分相比,输出图像将使我们感兴趣的对象更白。这是一个直观的解释。(我不能让它更简单)。利用直方图反投影法等方法。

我们该怎么做呢?我们创建一个包含我们感兴趣对象的图像的直方图(在我们的例子中,地面,离开播放器和其他东西)。该对象应尽可能地填充图像,以获得更好的结果。颜色直方图比灰度直方图更受欢迎,因为对象的颜色是定义对象的一种更好的方式,而不是它的灰度强度。然后我们在我们的测试图像上“反向工程”这个直方图我们需要找到这个物体,换句话说,我们计算了所有属于地面的像素的概率并显示它。由此产生的对正确阈值的输出使我们能够单独使用。

算法在Numpy

首先,我们需要计算我们需要找到的对象的颜色直方图(让它是“)”和我们要搜索的图像(让它成为“I”)。

import numpy as np
import cv2 as cv

roi = cv.imread('blue.jpg')
hsv = cv.cvtColor(roi,cv.COLOR_BGR2HSV)

target = cv.imread('tiananmen.jpg')
hsvt = cv.cvtColor(target,cv.COLOR_BGR2HSV)

# calculating object histogram
roihist = cv.calcHist([hsv],[0, 1], None, [180, 256], [0, 180, 0, 256] )

# normalize histogram and apply backprojection
cv.normalize(roihist,roihist,0,255,cv.NORM_MINMAX)
dst = cv.calcBackProject([hsvt],[0,1],roihist,[0,180,0,256],1)

# Now convolute with circular disc
disc = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
cv.filter2D(dst,-1,disc,dst)

# threshold and binary AND
ret,thresh = cv.threshold(dst,50,255,0)
thresh = cv.merge((thresh,thresh,thresh))
res = cv.bitwise_and(target,thresh)

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

 

猜你喜欢

转载自blog.csdn.net/qq_41905045/article/details/81570970