日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hsv 直方图均衡化_Opencv从零开始 - 「启蒙篇」- 直方图、直方图均衡和反向投射...

發布時間:2024/7/23 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hsv 直方图均衡化_Opencv从零开始 - 「启蒙篇」- 直方图、直方图均衡和反向投射... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要介紹一些opencv關于直方圖的一些知識運用,直方圖是非常常用的圖像處理方法,有時候在很多圖像預處理中能起到特別好的效果,大家可以一起來學習探討~


目錄

  • 直方圖
  • 計算直方圖
  • 直方圖均衡化
  • CLAHE 自適應均衡化
  • 2D直方圖
  • 直方圖反射投影

直方圖

?? 問:什么是直方圖?

? 答:直方圖是可以對整幅圖的灰度分布進行整體了解的圖示,通過直方圖我們可以對圖像的對比度、亮度和灰度分布等有一個直觀了解。

計算直方圖

  • 使用opencv的函數cv2.calcHist(images, channels, mask, histSize, ranges):
    • 參數1:要計算的原圖,以方括號的傳入,如:[img]。
    • 參數2:類似前面提到的dims,灰度圖寫[0]就行,彩色圖B/G/R分別傳入[0]/[1]/[2]。
    • 參數3:要計算的區域ROI,計算整幅圖的話,寫None。
    • 參數4:也叫bins,子區段數目,如果我們統計0-255每個像素值,bins=256;如果劃分區間,比如0-15, 16-31…240-255這樣16個區間,bins=16。
    • 參數5:range,要計算的像素值范圍,一般為[0,256)。
hist = cv2.calcHist([img], [0], None, [256], [0, 256]) # 性能:0.025288 s
  • 使用numpy的函數 np.bincount():
    • 用Numpy的函數計算,其中ravel()函數將二維矩陣展平變成一維數組.
hist = np.bincount(img.ravel(), minlength=256) # 性能:0.003163 s
  • 繪制直方圖使用Matplotlib自帶的繪制工具plt.hist()繪制。
plt.hist(img.ravel(), 256, [0, 256])

?? 當然,也可以用前面計算出來的結果繪制:

plt.plot(hist)

?? 當然,也可以繪制出r,g,b不同通道的直方圖

import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('../data/home.jpg')color = ('b','g','r')for i,col in enumerate(color): histr = cv.calcHist([img],[i],None,[256],[0,256]) plt.plot(histr,color = col) plt.xlim([0,256])plt.show()

r,g,b通道的直方圖

?? 當然,也可以繪制出ROI的直方圖

import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('../data/home.jpg',0)mask = np.zeros(img.shape[:2], np.uint8)mask[100:300, 100:400] = 255mask_img = cv.bitwise_and(img, img , mask = mask)hist_full = cv.calcHist([img],[0],None,[256],[0,256])hist_mask = cv.calcHist([img],[0],mask,[256],[0,256])cv.imshow('fd', mask_img)cv.waitKey(0)plt.subplot(221), plt.imshow(img, 'gray')plt.subplot(222), plt.imshow(mask,'gray')plt.subplot(223), plt.imshow(mask_img, 'gray')plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)plt.xlim([0,256])plt.show()

ROI的直方圖

直方圖均衡化

?? 一副效果好的圖像通常在直方圖上的分布比較均勻,直方圖均衡化就是用來改善圖像的全局亮度和對比度。

直方圖均衡化

OpenCV中用cv2.equalizeHist() 實現均衡化:

1?? 灰度圖均衡,直接使用cv2.equalizeHist(gray)

2?? 彩色圖均衡,分別在不同的通道均衡后合并

import cv2import numpy as npimg = cv2.imread("girl.jpg", 1)gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 灰度圖均衡化equ = cv2.equalizeHist(gray)# 水平拼接原圖和均衡圖result1 = np.hstack((gray, equ))# 彩色圖像均衡化,需要分解通道 對每一個通道均衡化(b, g, r) = cv2.split(img)bH = cv2.equalizeHist(b)gH = cv2.equalizeHist(g)rH = cv2.equalizeHist(r)# 合并每一個通道equ2 = cv2.merge((bH, gH, rH))# 水平拼接原圖和均衡圖result2 = np.hstack((img,equ2))

灰度均衡化

彩色均衡化

CLAHE 自適應均衡化

  • 直方圖均衡化是應用于整幅圖片的,會導致一些圖片部位太亮,導致大部分細節丟失,因此引入自適應均衡來解決這個問題。
  • 它在每一個小區域內(默認8×8)進行直方圖均衡化。當然,如果有噪點的話,噪點會被放大,需要對小區域內的對比度進行了限制。
  • 彩色圖同樣需要split為r,g,b后均衡,然后merge。
  • # 自適應均衡化,參數可選clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))cl1 = clahe.apply(img)

    2D直方圖

    ?? 2D直方圖通常需要考慮每個顏色(Hue)和飽和度(Saturation)。

    ?? 同樣適用cv2.calcHist()函數計算直方圖

    ?? 參數修改:

    • channels=[0,1] 因為我們需要同時處理 H 和 S 兩個通道。
    • bins=[180,256] H通道為180,S通道為256。
    • range=[0,180,0,256] H 的取值范圍在0到180, S的取值范圍在0到256。
    import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('home.jpg')hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)hist = cv.calcHist( [hsv], [0, 1], None, [180, 256], [0, 180, 0, 256] )plt.imshow(hist,interpolation = 'nearest')plt.show()

    2D直方圖

    直方圖反射投影

    • 反向投影可以用來做圖像分割,尋找感興趣區間。它會輸出與輸入圖像大小相同的圖像,每一個像素值代表了輸入圖像上對應點屬于目標對象的概率,簡言之,輸出圖像中像素值越高的點越可能代表想要查找的目標。
    • 直方圖投影經常與camshift(追蹤算法)算法一起使用。
    • 過程:首先要為包含我們感興趣區域的圖像建立直方圖。被查找的對象最好是占據整個圖像(圖像里全是對象),最好使用顏色直方圖,物體的顏色信息比灰度圖像更容易被分割和識別。再將顏色直方圖投影到輸入圖像查找目標,也就是找到輸入圖像中每一個像素點的像素值在直方圖中對應的概率,這樣就得到一個概率圖像,最后設置適當的閾值對概率圖像進行二值化。

    ?? Opencv函數 cv2.calcBackProject()直接實現反向投影,參數與cv2.calcHist() 基本一致。其中一個參數是要查找的目標的直方圖。在使用目標直方圖反向投影前應該進行歸一化處理。返回結果是一個概率圖像,然后進行圓盤形狀卷積操作,再二值化。

    import cv2import numpy as np# 想要尋找的roi圖片roi = cv2.imread('roi.png')hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)# 目標搜索圖片target = cv2.imread('football.png')hsvt = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)# 計算roi直方圖roihist = cv2.calcHist([hsvt], [0, 1], None, [180, 256], [0, 180, 0, 256])# 歸一化,參數為原圖像和輸出圖像,歸一化后值全部在0到255范圍# cv2.NORM_MINMAX 對數組的所有值進行轉化,使它們線性映射到最小值和最大值之 間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))dst = cv2.filter2D(dst, -1, disc)ret, thresh = cv2.threshold(dst, 50, 255, 0)#使用merge變成通道圖像thresh = cv2.merge((thresh,thresh,thresh))# 按位操作res = cv2.bitwise_and(target, thresh)res = np.hstack((target, thresh, res))cv2.imwrite('res.jpg', res)# 顯示圖像cv2.imshow('1', res)cv2.waitKey(0)cv2.destroyAllWindows()

    roi圖片

    目標圖

    查詢結果

    未完待續~

    ------------------------------------可愛の分割線------------------------------------

    更多Opencv教程將后續發布,歡迎關注喲~??????

    總結

    以上是生活随笔為你收集整理的hsv 直方图均衡化_Opencv从零开始 - 「启蒙篇」- 直方图、直方图均衡和反向投射...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。