使用MATLAB進行圖片的處理十分方便,看它的名字就知道了,矩陣實驗室(matrix laboratory)。一副圖片的像素資料可以看成是一個二維數組一個大矩陣,MTABLAB就是為矩陣運算而生。
MATLAB對於影像處理中有豐富的函數,最簡單的RGB轉Gray只需要一個函數rgb2gray()即可完成。但是如果光是這樣學習影像處理,是沒有多大意義的,所以博主決定自己根據原理用MATLAB實現一些影像處理的基礎演算法。作為使用FPGA實現各種影像處理演算法的前期模擬,以便後期進行結果對比。順便記錄一些MATLAB在影像處理中的常用代碼和函數。
將彩色映像轉化為灰階的方法有兩種,一個是令RGB三個分量的數值相等,輸出後便可以得到灰階映像,另一種是轉化為YCbCr格式,將Y分量提取出來,YCbCr格式中的Y分量表示的是映像的亮度和濃度所以只輸出Y分量,得到的映像就是灰階映像了。我在這裡選擇第二種方法實現。
YCbCr是通過有序的三元組來表示的,三元由Y(Luminance)、Cb(Chrominance-Blue)和Cr(Chrominance-Red)組成,其中Y表示顏色的明亮度和濃度,而Cb和Cr則分別表示顏色的藍色濃度位移量和紅色濃度位移量。人的肉眼對由YCbCr色彩空間編碼的視頻中的Y分量更敏感,而Cb和Cr的微小變化不會引起視覺上的不同,根據該原理,通過對Cb和Cr進行子採樣來減小映像的資料量,使得映像對儲存需求和傳輸頻寬的要求大大降低,從而達到在完成映像壓縮的同時也保證了視覺上幾乎沒有損失的效果,進而使得映像的傳輸速度更快,儲存更加方便。我們要的到灰階映像,首先要將採集到的彩色映像轉化為YCbCr。
這是OV7725的手冊中給出的RGB888 to YCbCr的演算法公式。簡單明了,將一副圖片的RGB分量提取出來,然後用上面的公式進行運算,得到YcbCr分量,然後在合成顯示即可。這樣顯示出來的是YcbCr色彩空間的圖片,我們只取Y分量作為新的圖片的三個分量合成,得到的即是這幅彩色圖片的灰階圖。下面先記錄一些MATLAB在影像處理中常用文法和函數。
清空和關閉命令
clc 清空命令地區
clear 清空工作區
clear all 清空工作區與全域變數
close 關閉當前視窗
close all 關閉所有視窗
這幾條命令一般寫在代碼的開頭,用來清空或關閉之前操作殘留的視窗和命令。
合成和提取RGB的三個分量
fR、fG、fB分別表示RGB三個分量的映像。一副RGB映像可以利用cat(級聯)操作符合成彩色映像。
rgb_image = cat(3, fR, fG, fB)
提取三個分量
fR = RGB(:, :, 1); 紅色分量
fG = RGB(:, :, 2); 綠色分量
fB = RGB(:, :, 3); 藍色分量
size()函數得到圖片的行列數
[ROW, COL,DIM] = size(R_data); 得到一副映像的行列數。
顯示圖片
figure, imshow(imag) 儲存第一幅映像並同時顯示第二幅映像。
顯示圖片用imshow()函數,前面加個figure; 可以在原來顯示的基礎上重新開啟一個視窗顯示。
產生矩陣函數
zeros函數——產生零矩陣
ones函數——產生全1陣
【zeros的使用方法】
B=zeros(n):產生n×n全零陣。
B=zeros(m,n):產生m×n全零陣。
B=zeros([m n]):產生m×n全零陣。
B=zeros(d1,d2,d3……):產生d1×d2×d3×……全零陣或數組。
B=zeros([d1 d2 d3……]):產生d1×d2×d3×……全零陣或數組。
B=zeros(size(A)):產生與矩陣A相同大小的全零陣。
【ones的使用方法】
ones的使用方法與zeros的使用方法類似。
RGB轉YcbCr色彩空間MATLAB代碼實現
1 %將一幅640*480的彩色圖片轉換成顯示成灰階顯示? 2 clc; 3 clear all; 4 close all; 5 6 RGB_data = imread('lena.jpg');%映像讀入 7 8 R_data = RGB_data(:,:,1); 9 G_data = RGB_data(:,:,2);10 B_data = RGB_data(:,:,3);11 12 imshow(RGB_data);13 14 [ROW,COL, DIM] = size(RGB_data); %提取圖片的行列數15 16 Y_data = zeros(ROW,COL);17 Cb_data = zeros(ROW,COL);18 Cr_data = zeros(ROW,COL);19 Gray_data = RGB_data;20 %YCbCr_data = RGB_data;21 22 for r = 1:ROW 23 for c = 1:COL24 Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c);25 Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + 128;26 Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + 128;27 end28 end 29 30 % YCbCr_data(:,:,1)=Y_data;31 % YCbCr_data(:,:,2)=Cb_data;32 % YCbCr_data(:,:,3)=Cr_data;33 34 % figure;35 % imshow(YCbCr_data);36 37 Gray_data(:,:,1)=Y_data;38 Gray_data(:,:,2)=Y_data;39 Gray_data(:,:,3)=Y_data;40 41 figure;42 imshow(Gray_data);結果顯示
我們進行影像處理一般是顯示灰階圖,所以只提取YcbCr的Y分量,就可以顯示出lena的灰階圖的了。
原圖
灰階圖
嗯,很漂亮。
請註明出處:NingHeChuan(寧河川)
個人訂閱號:開源FPGA
如果你想及時收到個人撰寫的博文推送,可以掃描左邊二維碼(或者長按識別二維碼)關注個人訂閱號
知乎ID:NingHeChuan
微博ID:NingHeChuan
原文地址: