Python opencv學習-13 直方圖反向投影(用於影象分割)
阿新 • • 發佈:2021-02-03
技術標籤: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)