基于色彩空间,由“sample”反向投影至“target”中。
原图像:
原图HSV色彩空间:
sample hsv图像:
海浪🌊
结果:
代码部分:
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
def back_projection(image1, image2):
"""
实现直方图反射投影
:param image1: sample图像
:param image2: target图像
"""
hsv1 = cv.cvtColor(image1, cv.COLOR_BGR2HSV)
hsv2 = cv.cvtColor(image2, cv.COLOR_BGR2HSV)
cv.imshow("sample", hsv1)
cv.imshow("target", hsv2)
hist_sample = cv.calcHist([hsv1], [0, 1], None, [32, 32], [0, 180, 0, 256])
# 归一化至0-256
cv.normalize(hist_sample, hist_sample, 0, 255, cv.NORM_MINMAX)
"""
[hsv2]:被反射图像
[0, 1]:搜索通道
hist_sample:采样点(直方图)
[0, 180, 0, 256]:采样范围
1:缩放比例,这里为原比例
"""
dst = cv.calcBackProject([hsv2], [0, 1], hist_sample, [0, 180, 0, 256], 1)
cv.imshow("backProjection", dst)
def hist2d(image):
"""
src:输入图像
channel:需要绘制的通道
mask:遮罩
histSize:分组数量
range:统计范围
"""
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
hist = cv.calcHist([hsv], [0, 1], None, [32, 32], [0, 180, 0, 256])
plt.imshow(hist, interpolation='nearest')
plt.title("2D Histogram")
plt.show()
src = cv.imread("data/starry_night.jpg")
cv.imshow("original", src)
# hist2d(src)
sample = cv.imread("data/blue_ocean.jpg")
back_projection(sample, src)
cv.waitKey(0)
cv.destroyAllWindows()