cv2.calcHist()函式回傳值,灰度值為255的像素個數看似為0的細節探究,
import cv2
import matplotlib.pyplot as plt
import numpy as np
img=cv2.imread("gray.jpg",cv2.IMREAD_GRAYSCALE) #灰度模式加載,
print(img.shape)
H=np.zeros(256)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
**if img[i,j]!=255:** #灰度圖,灰度值為255的像素個數不計算,最后默認為0.
H[img[i,j]]=H[img[i,j]]+1
#print(H.astype(np.int32))
plt.plot(H.reshape(256,1),color='b')
#這個是自己算的亮度直方圖中像素個數統計資訊,灰度值為255的像素個數不統計之后,和cv2.calcHist()統計資訊回傳結果一樣,可能是因為255代表白色,所以灰度圖不需要統計白色像素值,
histb=cv2.calcHist([img],[0],None,[256],[0,255])#統計影像直方圖資訊,
print(histb.shape)
print(histb.astype(np.int32))
#histb==H.reshape(256,1)
print(histb.sum())
#img.shape=(320, 518),這個結果乘出來是165,760,
#histb.sum()=157932.0.
#也就是有7828個灰度值為255的像素點沒被統計,結果7828也非常好計算,
count=0
for i in range(img.shape[0]):
for j in range(img.shape[1]):
if img[i,j]==255:
count=count+1
OK!
后來我發現我上邊的錯了,cv2.calcHist的range引數是[0,255]的時候,255灰度值的像素個數統計為0,但是引數是[0,256]的時候,255灰度值的像素個數統計為正確的個數,(range引數代表像素值的取值范圍,)
改一下引數就會發現這個有趣的地方:
histb=cv2.calcHist([img],[0],None,[256],[0,256])#統計影像直方圖資訊,
這個得到的結果對比:上圖是原來[0,255]的資料,下圖是[0,256]的資料,


根據這個結果,我認為range引數取得是左閉右開區間,當引數是[0,255]時候,histb形狀是(256,1),所以histb的第256個元素的統計個數一定為0,然而引數是[0,256]時候,histb的第256個元素就會得到像素值的統計個數,
接著,查看opencv/ calcHist函式原始碼中:
//位深度為8位的影像,一個基礎元素的范圍都在**[0,255)**內,
(這里某博主注釋的是[0,255),看來是不計算255的,)
const int low = 0, high = 256;
/*
*/
for( j = low; j < high; j++ )// 灰度值j 從0到255 回圈
{
/* */
}
但是從源碼這個for遍歷來看,是要計算255的,
參考(https://blog.csdn.net/zhjm07054115/article/details/24498839)
這是阿婆主小白猜測,希望有大佬指正錯誤,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/226861.html
標籤:python
上一篇:一位面試官詢問我:Java中的JVM記憶體溢位和記憶體泄露是什么?我這么回答成功拿到了offer。
下一篇:c++#陣列#思維導圖
