学习文章:https://www.cnblogs.com/xianyufpga/p/12407716.html
实战功能:通过fpga将RGB图像转换成Gray灰度图像。
实战原理:彩色图像是由RGB三基色构成的,根据三个分量的数值不同而显示不一样的彩色。RGB565格式的像素排列为R[15:11]、G[10:5]、B[4:0],因此这里利用保存其中一个分量的数值,其他两个分量被这个分量填补即可实现彩色图像灰度化。
在Matlab上实现,用于检验fpga实现的正确性:
Matlab代码:
clc; clear all; RGB = imread('G:\shizhan\4 gray_image\doc\image.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中的一样,实战完成。