4基于fpga的彩色图像灰度化(ROM)

学习文章:https://www.cnblogs.com/xianyufpga/p/12407716.html

实战功能:通过fpga将RGB图像转换成Gray灰度图像。

RGB分量转灰度的原理:彩色图像是由RGB三基色构成的,根据三个分量的数值不同而显示不一样的彩色。RGB565格式的像素排列为R[15:11]、G[10:5]、B[4:0],因此这里利用保存其中一个分量的数值,其他两个分量被这个分量填补即可实现彩色图像灰度化。

这里的图片是RGB565格式:用两个字节,即16位来描述一个像素。5+6+5。


 在Matlab上实现,用于检验fpga实现的正确性:

Matlab代码:

clc;
clear all;
RGB = imread('G:shizhan4 gray_imagedocimage.jpg'); %读取图像

R_gray = RGB(:,:,1);        %提取R分量后的灰度图
G_gray = RGB(:,:,2);        %提取G分量后的灰度图
B_gray = RGB(:,:,3);        %提取B分量后的灰度图

subplot(2,2,1);imshow(RGB);   title('原图');
subplot(2,2,2);imshow(R_gray);title('R分量灰度图');
subplot(2,2,3);imshow(G_gray);title('G分量灰度图');
subplot(2,2,4);imshow(B_gray);title('B分量灰度图');

实现结果:


 fpga实现中通过按键,切换原图和三个不同提取分量的图片。

彩色转灰度的关键代码:

module RGB_Gray(
input clk_33M,
input sys_rst_n,
input [15:0]image,
input [2:0]key_cnt,  
output reg[15:0]data
);

always @(posedge clk_33M or negedge sys_rst_n)begin
if(!sys_rst_n)
data<=16'd0;
else begin
case(key_cnt)
3'd0:data<=image;
3'd1:data <= {image[15:11],image[15:11],1'b0,image[15:11]};
3'd2:data <= {image[10:6],image[10:5],image[10:6]};
3'd3:data <= {image[4:0],image[4:0],1'b0,image[4:0]};
endcase
end
end

endmodule

显示在TFT中的图片结果与Matlab中的一样,实战完成。

原文地址:https://www.cnblogs.com/FPGAer/p/13934167.html