1. 程式人生 > 其它 >Python opencv學習-13 直方圖反向投影(用於影象分割)

Python opencv學習-13 直方圖反向投影(用於影象分割)

技術標籤:Python OpenCV 影象學習-21年pythonopencv

程式碼和圖片大量參考https://blog.csdn.net/tengfei461807914/article/details/77075567

自己跑了下驗證了下~

個人理解:直方圖反向投影用來做影象分割,或者說知道了一個目標的圖片的一部分,去另一個包含這個目標的圖中去分割這個目標,如去圖2中找圖1 的部分

圖1

圖2

import cv2
import numpy as np
from matplotlib import pyplot as plt
#roi圖片,就想要找的的圖片
roi = cv2.imread('image1/small.png')
hsv = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)

#目標搜尋圖片
target = cv2.imread('image1/big.png')
hsvt = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)

#計算目標直方圖
roihist = cv2.calcHist([hsv],[0,1],None,[180,256],[0,180,0,256])

#歸一化,引數為原影象和輸出影象,歸一化後值全部在2到255範圍
cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)
# 實現反向投影hsvt為目標搜尋圖片, roihist為要找圖片的直方圖
dst = cv2.calcBackProject([hsvt],[0,1],roihist,[0,180,0,256],1)

#卷積連線分散的點
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
dst = cv2.filter2D(dst,-1,disc)

# 將獲取到的概率影象二值化,獲取到掩膜
ret,thresh = cv2.threshold(dst,50,255,0)
#使用merge變成3通道影象(因為原圖是3通道)
thresh = cv2.merge((thresh,thresh,thresh))

#蒙板
res = cv2.bitwise_and(target,thresh)
#矩陣按列合併,就是把target,thresh和res三個圖片橫著拼在一起
res = np.hstack((target,thresh,res))

cv2.imwrite('res.jpg',res)
#顯示影象
cv2.imshow('1',res)
cv2.waitKey(0)