opencv学习笔记21:直方图和掩膜 原理及其应用
直方圖概念
如圖:下面黑色圖為上面圖的直方圖
橫坐標:圖像中各個像素點的灰度級
縱坐標:具有該灰度級的像素個數。
歸一化直方圖
橫坐標:圖像中各個像素點的灰度級
縱坐標:出現該灰度級的概率。
DIMS:使用參數的數量
dims=1:灰度直方圖,僅僅考慮灰度的情況。
還有其他考慮亮度的
BINS:參數子集的數目
bins=256: 如灰度是256. 表示0-255
縮小數字表示將臨近值合并。
RANGE:統計灰度值的范圍,一般為[0-255]
最小值0:黑色
最大值255:白色
直方圖繪制
python+opencv
1.使用matplotlib繪制直方圖
函數:hist(數據源,像素級)
數據源:圖像,必須是一維數組
像素級:一般是256,指[0-255]
np.raval()可以實現多維數組轉一維。
import cv2 import matplotlib.pyplot as plt o=cv2.imread("boat.jpg") cv2.imshow("original",o) plt.hist(o.ravel(),256)#o.ravel()將像素數組轉一維 plt.show() cv2.waitKey() cv2.destroyAllWindows()像素直方圖
2.使用opencv繪制直方圖
hist=cv2.calcHist(images,channels,mask,histsize,ranges,accumulate)
hist:直方圖
images:原始圖像,格式[src],需要用中括號括起來
channels:通道,灰色直接[0],BGR對應[0],[1],[2]
mask:掩碼圖像。如果一個圖很大,需要計算部分圖的直方圖,需要掩碼。
histsize:BINS的數量,需要用中括號括起來。一般是[256]
ranges:像素值范圍,一般[0,255]
accumulate:累積標識。可選參數、默認false,設為true為計算好幾幅圖的直方圖。
繪制灰度圖像直方圖
不使用掩碼
繪制彩色圖像直方圖
不使用掩膜
注意012,是BGR,非RGB
3.使用掩膜的直方圖
生成掩膜
mask=np.zeros(image.shape,np.unit8)#生成全黑圖像
mask[200:400,200:400]=255#部分取白
把生成的掩膜傳入下列函數的mask中,即完成。
hist=cv2.calcHist(images,channels,mask,histsize,ranges,accumulate)
原圖
藍色為使用掩膜的直方圖
掩膜處理
黑色為0,其他色為1.將掩膜與原始圖像進行與操作。得到處理結果。
使用方法
計算結果=cv2.bitwise_and(原始圖像,掩膜)
bitwise:按位操作
and:與運算
直方圖均衡化
應用場合:圖像過亮或者過暗。如車牌識別
理論前提:如果一個圖像占有全部可能的灰度級,并且均勻分布。
結論:該圖像具有高對比度和多變的灰度色調。讀取的是灰度圖
外觀:圖像細節豐富,質量更高。
算法
1.計算累積直方圖
2.將累積直方圖進行區間轉換
3.在累積直方圖中,概率相近的原始值,會被處理成相同的值。
1.計算累積直方圖
2.將累積直方圖進行區間轉換
累積直方圖:對前面求和。1的值=0和1的值的和
3.在累積直方圖中,概率相近的原始值,會被處理成相同的值。
7是因為給出的示例是三維的二進制,范圍是0-7,如果是np.unit9,應是255。
四舍五入得到新的值:原先是0的像素變成1,原始是1的像素變成3…。
新的像素有1,3,4,5,6,7。是因為合并如原先的45都變成了5。
換成255的數示例
方法
dst=cv2.equalizeHist(src)
dst:處理結果
src:源圖像。
直方圖對比
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('equ.bmp',cv2.IMREAD_GRAYSCALE) equ = cv2.equalizeHist(img) plt.hist(img.ravel(),256) plt.figure() plt.hist(equ.ravel(),256) plt.show()原始
處理后
示例:
處理的是灰度圖,需要讀取灰色圖
總目錄鏈接:
python3+opencv學習筆記匯總目錄(適合基礎入門學習)
電氣專業的計算機小白,寫博文不容易。如果你覺得本文不錯,請點個贊支持下。謝謝。
總結
以上是生活随笔為你收集整理的opencv学习笔记21:直方图和掩膜 原理及其应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 民航招飞行员要求
- 下一篇: 遥控坦克电机不转啥原因