Image relief effect

图像浮雕效果实现

工作原理

浮雕效果定义

浮雕效果:指计算每个像素点与其周围像素的差值,差别较大的像素点在灰度图像中表现较为亮,边缘凸起,成浮雕形状。效果如下:

test1

原图

浮雕效果图

实现原理

本作业中采用二维傅里叶变换实现浮雕效果。

二维傅里叶变换(离散)是一种将图像从空间域转换到频域的变换方法。图像可看作二维矩阵,本作业中的图像为彩色,包含RGB三个通道的灰度信息。利用二维离散傅里叶变换可以将图像从空间域(即二维灰度数表)转换到频域(即频率数表),便于进行频域滤波等操作。

变换具体公式为:

其中$f(x,y)$ 代表大小为 M x N 的图像矩阵(其中$ x = 0,1,2,···,M-1$ 和 $y = 0,1,2,···,N-1$);$F(u,v)$ 表示 $f(x,y)$ 的傅里叶变换。

变换完成后,在时域上分别对x、y方向上进行差分叠加,然后借助不同的灰度等级逐步调节矩阵,即可得到浮雕效果。

Matlab源代码

relief函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function result = relief(image, num)     % num为通道数
[h, w, ~]=size(image);
% 生成每一列对应的jw_x和jw_y
fx = linspace(floor(-w/2)+1, floor(w/2), w);
fx = fx / w * 2 * pi * 1i;
fy = linspace(floor(-h/2)+1, floor(h/2), h);
fy = fy' / h * 2 * pi * 1i;
% 结果初始化
result = zeros(size(image));
% 逐个通道处理
for channel = 1:num
s = double(image(:, :, channel));
f = fftshift(fft2(s));
% 求差分并叠加
df = f.*(1 - exp(-fx)) + f.*(1 - exp(-fy));
result(:, :, channel)=real(ifft2(ifftshift(df)));
end
% 中心化与规范化
result = double(result)./(max(result) - min(result))*255.0 + 128.0;
result = uint8(result);
end

主程序(调用relief函数)

1
2
3
image_input = imread("test.jpg");
image_output = relief(image_input, 3);
imshow(image_output);

测试图片

测试1(1024*683)

test

result1

测试2(532*300)

test2

res2

测试3(3840*2160)

test4

res4

测试4(681*517)

test3

res3


Image relief effect
http://example.com/2022/03/02/Image-relief-effect/
作者
Thunderbolt
发布于
2022年3月2日
许可协议