影象處理的基礎知識(1)
第一步、對影象進行一個初步的認識:
彩色影象:每個畫素由R、G、B三個分量表示,每個通道取值範圍0~255。資料型別一般為8位無符號整形。範例:
filePath = "F:\\learning\\code(1)\\Py\\1.jpg"
img = cv2.imread(filePath)
print(img.shape)
輸出:
(300, 506, 3)
灰度影象:每個畫素只有一個取樣顏色的影象,這類影象通常顯示為從最暗黑色到最亮的白色的灰度。標註的灰度影象灰度級數為256.
filePath = "F:\\learning\\code(1)\\Py\\timg.jpg" img = cv2.imread(filePath,0) print(img.shape)
輸出:(輸出的是220*220的矩陣)
(220, 220)
二值影象(黑白影象):每個畫素點只有兩種可能,0和1.0代表黑色,1代表白色。資料型別通常為1個二進位制位。
filePath = "F:\\learning\\code(1)\\Py\\0.jpg"
img = cv2.imread(filePath, 0)
print(img.shape)
輸出:(輸出是有0和1組成的309*450的矩陣)
(309, 450)
注意:
1、OpenCV的imread()和imwrite()能支援各種靜態影象檔案格式。不同的系統支援的檔案格式不一樣,但都支援BMP,通常還支援PNG、JPEG、TIFF格式。(處理醫學的.dcm和.mhd影象時,推薦使用:SimpleITK,關於.dcm和.mhd的處理後續會詳細介紹)
第二步:影象的基本概念
取樣:是指將空域上和時域上連續的影象(模擬影象)變換成離散取樣點(畫素)集合的一種操作。下圖所示為二維平面採用的過程:
圖1 影象取樣示意圖
影象的解析度:取樣所獲得的影象總畫素的多少:例如309*405影象的總畫素為:125145個。
量化:學習訊號與系統的都知道量化,意義是一樣的,都是把取樣點上表示亮暗的連續量離散化後,用數值來表示的。
藉助“量化”的概念來理解一下:
8bit影象:影象中的每個畫素都用8位二進位制數表示,即2的8次方=256個量級
16bit影象:影象中的每個畫素都用16位二進位制數表示,即2的16次方=65536個量級
24bit影象:影象中的每個畫素都用24位二進位制數表示,即2的24次方=1667萬個量級
注意:量級越大,影象質量就越高,儲存空間就越大。
第三步:一個很重要的概念:灰度直方圖
灰度直方圖:是關於灰度級分佈的函式,是對影象中灰度級分佈的統計。將數字影象中的所有畫素,按照灰度值的大小,統計其所出現的頻度。
灰度直方圖性質:
①:灰度直方圖表徵了影象的以為資訊;
②:灰度直方圖與影象之間的關係是多對一的對映關係;
③:子圖直方圖之和為整圖的直方圖;
用途:
①:作為影象數字化引數
②:影象分割閾值的選擇依據
範例:顯示影象的直方圖
filePath = "F:\\learning\\code(1)\\Py\\1.jpg"
img = cv2.imread(filePath)
b, g, r = cv2.split(img)
def calcAndDrawHist(image, color):
hist = cv2.calcHist([image], [0], None, [256], [0.0, 255.0])
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(hist)
histImg = np.zeros([256, 256, 3], np.uint8)
hpt = int(0.9 * 256)
for h in range(256):
intensity = int(hist[h] * hpt / maxVal)
cv2.line(histImg, (h, 256), (h, 256 - intensity), color)
return histImg
histImgB = calcAndDrawHist(b, [255, 0, 0])
histImgG = calcAndDrawHist(g, [0, 255, 0])
histImgR = calcAndDrawHist(r, [0, 0, 255])
cv2.imshow("histImgB", histImgB)
cv2.imshow("histImgG", histImgG)
cv2.imshow("histImgR", histImgR)
cv2.imshow("Img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
顯示:
注意:
2、關於使用imshow('顯示影象的幀名稱',要顯示影象的本身)顯示影象時,一定要新增:
cv2.waitKey(0) #等待鍵盤觸發時間
cv2.destroyAllWindows() #釋放由OpenCV建立的所有視窗
3、cv2.cvtColor()函式將影象轉換為BGR格式:
filePath = "F:\\learning\\code(1)\\Py\\1.jpg"
img = cv2.imread(filePath)
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
4、imwrite()要求影象為BGR活灰度格式,並且每個通道要有一定的位(bit),輸出格式要支援這些通道。(BMP格式要求每一個通道有8位,PNG要求每個通道有8位活16位)
filePath = "F:\\learning\\code(1)\\Py\\1.jpg"
img = cv2.imread(filePath, 0) #寫0是將影象轉換為灰度圖讀取
cv2.imwrite('result.png', img)
圖1 原圖
圖2 result