11浮雕画

一、实战原理

与上一个实战类似,只不过这里的浮雕图像处理公式为:NewPixel(i,j)=Pixel(i,j+1)-Pixel(i,j)+value。

二、matlab实现

这里的阈值value设置为80。

%--------------------------------------------------------------------------
%                         浮雕画
%--------------------------------------------------------------------------
clc;
clear all;
RGB = imread('G:\test\11 emboss\image.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('浮雕画');
View Code

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的图像一样,另一个问题是画面边沿有一条白色。 

 

posted @ 2020-12-10 13:18  LiYiRui  阅读(119)  评论(0编辑  收藏  举报