使用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:COL 24 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 end 28 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