1. 程式人生 > >影象處理的基礎知識(1)

影象處理的基礎知識(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