基於MATLAB的RGB轉YCBCR色彩空間轉換

來源:互聯網
上載者:User

  使用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

原文地址:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.