在绘画风格中,素描风格是一种以黑白灰(或单色)色调为主的绘画风格,注重表现物体的轮廓、结构、明暗关系等细节。在数字图像处理中,素描风格变换是一种图像风格变换的过程,用于呈现素描的视觉效果。本文主要介绍数字图像素描风格变换的基本原理,以及使用 紫光同创 PGL22G 开发板实现数字图像素描风格变换的过程。
目录
????????在绘画风格中,素描风格是一种以黑白灰(或单色)色调为主的绘画风格,注重表现物体的轮廓、结构、明暗关系等细节。
图像素描风格效果有以下 4 个特征:
(1)整体画面为黑白灰色;
(2)主要表现物体的边界,且边界线条颜色较重;
(3)相同或相近色彩区域白色;
(4)不同区域明暗不同,略有光源效果。
????????在数字图像处理中,素描风格变换是一种图像风格变换的过程,用于呈现素描的视觉效果。对于彩色图像,素描风格变换的大致思路如下:
(1)RGB 转灰度图。以 RGB 格式读取图像,然后进行 RGB 转灰度图处理;
(2)边缘检测。在灰度图的基础上,选择合适的边缘检测模板,得到梯度信息;
(3)灰度变换。在三维空间中设置一个虚拟点光源(位于图像上方,俯仰角 ,方位角?),计算梯度在光源方向上的投影,梯度趋于光源方向的像素点,灰度值越大。
? ? ? ? 使用 Matlab 进行验证,代码如下:
clc, clear
% RGB转灰度图
im = imread('./loopy.png');
im_gray = im2gray(im);
% 边缘检测
depth = 10;
h = fspecial('log');
edge_x = double(imfilter(im_gray, h))*depth/100;
edge_y = double(imfilter(im_gray, h'))*depth/100;
A = sqrt(edge_x.^2 + edge_y.^2 + 1);
uni_x = edge_x./A;
uni_y = edge_y./A;
uni_z = 1./A;
% 模拟光源
theta_el = pi/2.2;
theta_az = pi/2;
dx = cos(theta_el)*cos(theta_az);
dy = cos(theta_el)*sin(theta_az);
dz = sin(theta_el);
% 模拟光源
theta_el = pi/2.2;
theta_az = pi/2;
dx = cos(theta_el)*cos(theta_az);
dy = cos(theta_el)*sin(theta_az);
dz = sin(theta_el);
subplot(121)
imshow(im2uint8(im))
title('原图像')
subplot(122)
imshow(im2uint8(im_new))
title('处理后图像')
????????使用紫光同创 FPGA 平台实现素描风格变换功能,FPGA 需要实现的功能与指标如下:
(1)与电脑的串口通信,用于接收上位机下发的图像数据,波特率为 256000 Bd/s;
(2)素描风格变换:包括?RGB 转灰度图、边缘检测、灰度变换处理过程,实现数字图像的素描风格变换;
(3)DDR3 读写控制,将处理前后的图像数据分别写入 DDR3 的不同区域,实现图像的拼接;
(4)HDMI 输出,输出一路 HDMI 信号源,用于将拼接后的图像显示在外接显示器上,分辨率为 1024×768。
?
? ? ? ? 基于紫光同创 PGL22G 平台,进行逻辑设计,以下是工程主要的模块与功能说明。
模块名称 | 功能说明 | |
top_uart | uart_rx_slice | 串口接收驱动模块 |
uart_rx_parse | 串口数据解析模块,从上位机接收 8bit 原始图像 | |
top_vidin | conv_rgb2gray | RGB 转灰度图模块 |
conv_gradient | 边缘检测模块,对 3x3 的区域进行 Preweitt 边缘检测 | |
conv_sketch | 素描风格灰度变换模块 | |
vidin_pipeline | pipeline 单元模块,缓存两行图像数据,并将数据提交到 ddr3 数据调度模块 | |
vidin_pipeline_s | pipeline 简化单元模块,缓存两行图像数据 | |
merge_out | dvi_timing_gen | HDMI 视频时序产生模块 |
dvi_ddr_rd | 根据 HDMI 控制信号,提交读指令到 ddr3 数据调度模块 | |
dvi_encoder | HDMI 输出编码(8b10b 编码)与输出驱动模块 |
? ? ? ? 以下是素描风格变换的流程图。
素描风格变换流程图
(1)conv_rgb2gray 模块:根据 RGB-Gray 灰度变换公式,使用 FPGA 乘法器资源,得到灰度数据,实现 RGB 转灰度图。
(2)conv_gradient 模块:对图像 3x3 区域进行 Prewitt 边缘检测,得到水平方向与垂直方向的梯度信息,实现灰度图像的梯度计算。
(3)conv_sketch 模块:使用 Dual-port RAM 存储灰度变换函数,根据水平与垂直方向的梯度,得到转换后的灰度值,实现素描风格的灰度变换。
以下是工程资源报告。