一、实战原理
与上一个实战类似,只不过这里的浮雕图像处理公式为:NewPixel(i,j)=Pixel(i,j+1)-Pixel(i,j)+value。
二、matlab实现
这里的阈值value设置为80。
%-------------------------------------------------------------------------- % 浮雕画 %-------------------------------------------------------------------------- clc; clear all; RGB = imread('G: est11 embossimage.jpg'); %读取图像 gray = rgb2gray(RGB); %灰度图 [ROW,COL,N] = size(gray); %获得图像尺寸[高度,长度,维度] emboss = zeros(ROW,COL); value = 100; for i = 1:ROW for j=1:COL-1 emboss(i,j) = gray(i,j+1) - gray(i,j) + value; if emboss(i,j) > 255 emboss(i,j) = 255; elseif emboss(i,j) < 0 emboss(i,j) = 0; else emboss(i,j) = emboss(i,j); end end end emboss = uint8(emboss); subplot(2,1,1);imshow(gray); title('Y分量灰度图'); subplot(2,1,2);imshow(emboss);title('浮雕画');
matlab效果:
三、fpga实现:
关键代码:NewPixel(i,j)=Pixel(i,j+1)-Pixel(i,j)+value,公式中Pixel(i,j)就是打拍得到的Y2_r。
reg [7:0]Y2_r; wire [7:0]emboss; always @(posedge clk_33M or negedge sys_rst_n) begin if(!sys_rst_n) begin Y2_r <= 8'd0; end else begin Y2_r <= Y2; end end assign emboss = Y2 - Y2_r + value; //-255 ~ 510 always @(posedge clk_33M or negedge sys_rst_n)begin if(!sys_rst_n) emboss_data<=16'h0000; else if(emboss > 255) emboss_data<=16'hffff; else if(emboss < 0) emboss_data<=16'h0000; else emboss_data<={emboss[7:3],emboss[7:2],emboss[7:3]}; end
上面的代码延迟了两个clk才输出数据,因此把行信号和列信号进行同步处理。
信号同步处理:也与数据输出一样,延迟两拍再输出。
reg o_hs_r0; reg o_hs_r1; reg o_vs_r0; reg o_vs_r1; always @(posedge clk_33M)begin o_hs_r0<=o_hs; o_vs_r0<=o_vs; o_hs_r1<=o_hs_r0; o_vs_r1<=o_vs_r0; end assign emboss_hs=o_hs_r1; assign emboss_vs=o_vs_r1;
fpga效果:不知道是不是信号同步的问题,屏幕显示有两个问题:一个是fpga的阈值90才与matlab阈值80的图像一样,另一个问题是画面边沿有一条白色。