學習文章:https://www.cnblogs.com/xianyufpga/p/12408988.html
一、實戰原理:
將彩色圖像灰度化的方法有兩種:一種就是實戰4中RGB分量轉灰度,另一種是轉化為YCbCr格式,將Y分量提取出來,YCbCr格式中的Y分量表示的是圖像的亮度和濃度,所以只輸出Y分量,得到的圖像就是灰度圖像了。這里實現的是第二種方法:RGB565轉RGB888,再轉YCbCr444,最后取YCbCr的Y分量即可得到灰度圖像。
YCbCr是通過有序的三元組來表示的,三元由Y(Luminance)、Cb(Chrominance-Blue)和Cr(Chrominance-Red)組成,其中Y表示顏色的明亮度和濃度,而Cb和Cr則分別表示顏色的藍色濃度偏移量和紅色濃度偏移量。人的肉眼對由YCbCr色彩空間編碼的視頻中的Y分量更敏感,而Cb和Cr的微小變化不會引起視覺上的不同。根據該原理,通過對Cb和Cr進行子采樣來減小圖像的數據量,使得圖像對存儲需求和傳輸帶寬的要求大大減低,從而達到在完成圖像壓縮的同時也保證了視覺上幾乎沒有損失的效果,進而使得圖像的傳輸速度更快,存儲更加方便。我們要得到灰度圖像,首先要將采集到的彩色圖像轉化為YCbCr。
由於本次實驗的圖片是RGB565格式,因此需要轉換成RGB888格式(RGB888就是R-8bit,G-8bit,B-8bit)。
二、matlab實現:
由於matlab中本來就是RGB888格式,因此只需考慮RGB888格式轉YCbCr444。
兩者轉換公式:
Y=0.299R+0.587G+0.114B
Cb=0.568(B-Y)+128=-0.172R-0.339G+0.511B+128
Cr=0.713(R-Y)+128=0.511R-0.428G-0.083B+128
代碼設計:
%-------------------------------------------------------------------------- % RGB轉YCbCr取Y值轉灰度圖 %-------------------------------------------------------------------------- clc; clear all; RGB = imread('G:\image.jpg'); %讀取圖像 R = RGB(:,:,1); %R分量 G = RGB(:,:,2); %G分量 B = RGB(:,:,3); %B分量 [ROW,COL,N] = size(RGB); %獲得圖像尺寸[高度,長度,維度] for r = 1:ROW for c = 1:COL Y(r,c) = 0.299*R(r,c) + 0.587*G(r,c) + 0.114*B(r,c); Cb(r,c) = -0.172*R(r,c) - 0.339*G(r,c) + 0.511*B(r,c) + 128; Cr(r,c) = 0.511*R(r,c) - 0.428*G(r,c) - 0.083*B(r,c) + 128; end end subplot(2,2,1);imshow(R);title('R分量灰度圖'); subplot(2,2,2);imshow(G);title('G分量灰度圖'); subplot(2,2,3);imshow(B);title('B分量灰度圖'); subplot(2,2,4);imshow(Y);title('Y分量灰度圖');
原圖:
效果:
三、Verilog實現:
由於圖片格式RGB565,因此需要轉成RGB888格式:
再將RGB888轉換成YCbCr:
Y=0.299R+0.587G+0.114B
Cb=0.568(B-Y)+128=-0.172R-0.339G+0.511B+128
Cr=0.713(R-Y)+128=0.511R-0.428G-0.083B+128
公式實現先乘以256,后右移8位。分三步:
①計算乘法
②計算加減法
③除以256
接着,因為前面三步為了將Y分量提出出來,延遲了三個clk,因此要對同步信號和使能信號也進行延遲三個clk。
出現問題:Y分量灰度圖實現了,但是不知道為什么跟其他分量灰度圖按鍵切換的時候,圖片位置會變動?