python+opencv繪制直方圖
文章目錄
直方圖定義
- 橫坐標:圖像中各個像素點的灰度級
- 縱坐標:就有該灰度級的像素個數
歸一化直方圖
- 橫坐標:圖像中各個像素點的灰度級
- 縱坐標:出現這個灰度的概率
DIMS: 使用參數的數量
- dims = 1
- 灰度直方圖,僅僅一件事情,僅僅考慮灰度的情況
- BINS: 參數子集的數目
直方圖繪制方法
pyplot繪制直方圖
-
pyplot提供了類似matlab的繪圖框架
- import matplolib.pyplot as plt
-
函數hist
hist(數據源,像素級)
- 功能: 根據數據源合金像素級繪制直方圖
- 數據源: 圖像,必須是一維數組
- 函數ravel
b = a.ravel()
- 功能: 將多維數組降為一維數組
- 格式: 一維數組=多維數組.revel()
- 函數ravel
- 像素級: 一般是256,指[0, 255]
opencv繪制直方圖
- 統計直方圖函數 calcHist
hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)
- 參數
- images : 原始圖像
- channels : 指定通道
- 通道編號需要用中括號括起來
- 輸入圖像是灰度圖時,它的值為[0]
- 彩色圖像可以使[0],[1],[2]分別對應通道B,G,R。
- mask : 掩碼圖像
- 統計整幅圖像的直方圖,設為None。
- 統計圖像某一部分的直方圖時,需要掩碼圖像
- 生成掩碼圖像
mask = np.zeros(image.shape, np.uint8) mask[200:400, 200:400] = 255
- histSize : BINS的數量
- ranges : 像素值返回RANGE
- 像素值范圍,例如:[0, 255]
- accumulate : 累計標識
- 默認值為false
- 如果被設置為true,則直方圖在開始分配時不會被清零
- 該參數允許從多個對象中計算單個直方圖,或者用戶實施更新直方圖
- 多個直方圖的累計結果,用戶對一組圖像計算直方圖
- 返回值
- hist : 直方圖
- 使用pyplot繪制
- 參數
生成掩膜圖像
計算結果 = cv2.bitwise_and(圖像1, 圖像2)
- 例如:
mask = np.zero(800, np.uint8) mask[300:500, 300:500] = 255 masked_img = cv2.bitwise_and(img, mask)
直方圖均衡化
- 理論基礎
- 前提: 如果一幅圖像占有全部可能的灰度級,并且均勻分布。
- 結論: 該圖像具有高對比度和多變的灰度色調
- 外觀: 圖像細節豐富,質量更高
- 算法
- 計算累計直方圖
- 將累計直方圖進行區間轉換
- 在累計直方圖中,概率相近的原始值,會被處理為相同的值
- 應用場合
- 醫療圖像處理
- 車牌識別
- 人臉識別
- 均衡化函數equalizeHist
dst = cv2.equalizeHist(src)
- 參數
- src : 源圖像
- 返回值
- dst : 目標圖像,處理結果
- 參數
- 分欄函數subplot
subplot(nrows, ncols, plot_number)
- 參數
- nrows : 行號
- ncols : 列號
- plot_number : 窗口序號
- 示例:
subplot(2, 3, 4)
- 特例: 當每一個參數都小于10時,可以直接書寫三個數字,表示為
subplot(234)
- 參數
實例
使用pyplot繪制直方圖
import cv2
import matplotlib.pyplot as plt
o = cv2.imread("/home/forrest/圖片/lena彩圖.png", cv2.IMREAD_GRAYSCALE)
cv2.imshow("o", o)
plt.hist(o.ravel(), 256)
plt.show()
cv2.waitKey()
cv2.destroyAllWindows()
- 原圖
- 直方圖
使用calcHist生成灰度圖像直方圖
import cv2
img = cv2.imread("/home/forrest/圖片/lena彩圖.png", cv2.IMREAD_GRAYSCALE)
hist = cv2.calcHist([img], [0], None, [256], [0, 255])
print(type(hist))
print(hist.size)
print(hist.shape)
plt.plot(hist, color="r")
plt.show()
- 原始圖像
- 輸出結果
<class 'numpy.ndarray'>
256
(256, 1)
- 輸出直方圖
使用calcHist生成彩色圖像直方圖
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("/home/forrest/圖片/lena彩圖.png")
histb = cv2.calcHist([img], [0], None, [256], [0, 255])
histg = cv2.calcHist([img], [1], None, [256], [0, 255])
histr = cv2.calcHist([img], [2], None, [256], [0, 255])
plt.plot(histb, color="b")
plt.plot(histg, color="g")
plt.plot(histr, color="r")
plt.show()
- 原始圖像
- 生成直方圖
繪制掩碼直方圖
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread("/home/forrest/圖片/lena彩圖.png", cv2.IMREAD_GRAYSCALE)
mask = np.zeros(image.shape, np.uint8)
mask[200:400, 200:400] = 255
histMI = cv2.calcHist([image], [0], mask, [256], [0, 255])
histImage = cv2.calcHist([image], [0], None, [256], [0, 255])
plt.plot(histImage)
plt.plot(histMI)
plt.show()
- 原始圖像
- 繪制掩碼直方圖和整圖直方圖對比
生成掩膜圖像
import cv2
import numpy as np
image = cv2.imread("/home/forrest/圖片/lena彩圖.png", 0)
mask = np.zeros(image.shape, np.uint8)
mask[200:400, 200:400] = 255
mi = cv2.bitwise_and(image, mask)
cv2.imshow("original", image)
cv2.imshow("mask", mask)
cv2.imshow("mi", mi)
cv2.waitKey()
cv2.destroyAllWindows()
- 原始圖像
- 掩碼圖像
- 生成的掩膜圖像
圖像直方圖均衡化
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("/home/forrest/圖片/lena彩圖.png", cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img)
plt.subplot(221)
plt.imshow(img, plt.cm.gray)
plt.axis('off')
plt.subplot(222)
plt.hist(img.ravel(), 256)
plt.subplot(223)
plt.imshow(equ, plt.cm.gray)
plt.axis('off')
plt.subplot(224)
plt.hist(equ.ravel(), 256)
plt.show()
- 結果
pyplot顯示彩色圖像
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("/home/forrest/圖片/lena彩圖.png")
b,g,r = cv2.split(img)
img2 = cv2.merge([r, g, b])
plt.subplot(121)
plt.imshow(img)
plt.axis('off')
plt.subplot(122)
plt.imshow(img2)
plt.axis('off')
plt.show()
- 結果
智能推薦
OpenCV Matplotlib繪制直方圖
繪制直方圖有兩種方法: 使用Matplotlib中的繪圖函數 使用OpenCV自帶的繪圖函數 使用OpenCV自帶函數繪制直方圖比較麻煩,這個不做介紹 Matplotlib中有直方圖繪制函數:matplotlib.pyplot.hist()它可以直接統計并繪制直方圖 單通道–灰度圖 多通道–彩圖 從上邊的直方圖你可以推斷出藍色曲線靠右側的最多(很明顯這些就是天空)...
matplotlib繪制直方圖
頻次直方圖的簡單入門 繪制二維直方圖參考 https://blog.csdn.net/jasonzhoujx/article/details/81772846 具體參數詳解 https://www.sohu.com/a/195391558_654419 ...
Matlab 直方圖繪制
1.直方圖畫法 bar(垂直圖) barh(水平圖) stacked(嵌入) grouped(族群) eg. 2.改變matlab坐標軸刻度 改變后圖像為 最后加入x,y軸的標簽...
猜你喜歡
Matplotlib之直方圖繪制
1 直方圖介紹 直方圖由一系列高度不等的縱向條紋或線段表示數據分布情況,一般用橫軸表示數據范圍,縱軸表示分布情況。 特點: 繪制連續性的數據,展示一組或者多組數據的分布情況(統計)。 2 直方圖繪制 直方圖通過hist()函數繪制 • plt.hist(x, bins=None) # 繪制以x為數值,bins為組數,組數 = 極差/組距 示例: 某地區連續50年中四月份平均氣溫數據如下:...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...