MATLAB 长度和像素_MATLAB图像处理:把照片变成素描风格 V2 (1) 线描
![](/assets/blank.gif)
这是把照片变素描的第二种算法。感谢 @fandongxu 的提议。
算法出自于这篇论文:Combining Sketch and Tone for Pencil Drawing Production
大致分为两部分:线描 + 色调(阴影)
本文将介绍线描部分的算法,色调部分会在下一篇文章中介绍。
图片转线描
线描,也就是绘制轮廓,本质就是边缘检测。不过本文所述的算法并没有使用常见的边缘检测方法如sobel算子等,而是通过前向差分(forward difference)计算图像梯度(image gradient)来寻找边缘。
1. 前向差分和图像梯度
简单地说,给定一个数列,那么它的前向差分的结果就是数列中每个数的后一个数与当前数字的差。
由于图像(这里用符号
因此,
2. 图像梯度 vs 边缘检测算子
相比于卷积式边缘检测(即使用算子对图像进行卷积,配合恰当的阈值来判断哪些点是边缘),图像梯度计算出的边缘相对更“嘈杂”,更符合我们绘画时的真实情况。
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
注:此处基于算子的边缘检测,我们只讨论使用Matlab自带的edge函数的情况,是否有其他方法通过算子来实现图3的效果,由于没有做过相关调研,所以不在我们的讨论范围内。
3. 降噪
在论文中作者提到,上文所说的图像梯度G的质量很容易受到噪声影响,而且当轮廓复杂时,这样提取的轮廓会过于破碎、短线条太多。因此他们采用8方向卷积的方式对G进行进一步的滤波降噪。
所谓8方向卷积,就是使用八个不同方向的线段作为卷积核,分别对图像梯度G进行卷积,然后将卷积结果合并,就得到最终的轮廓图像。
3.1. 8方向卷积核
![](/assets/blank.gif)
如图所示,8个卷积核为大小相同的正方形,其边长可以随意设置。论文中将边长设置为G矩阵长或宽的1/30。过卷积核中心做一水平直线(直线上所有像素值为1,直线外所有像素值为0),将该直线以卷积核中心为轴旋转,取每旋转22.5°后的图片为一个卷积核。这样就得到8个不同方向的卷积核,分别用于提取这8个方向的轮廓。
3.2. 原图卷积
在使用卷积核之前,先将其归一化,也就是使得卷积核中所有像素值相加为1。然后用这8个归一化卷积核与图像梯度G进行卷积,并保证卷积后的图像大小与G相同,得到的8个图像就是这8个方向的轮廓特征。
3.3. 卷积结果合并
论文中没有直接将8个卷积结果叠加,其合并过程分两步:
(1)处理卷积结果
我们在卷积时保证了图像大小不变,因此卷积结果与G中的像素可以一一对应。对于每个像素点位(i, j),看8个卷积结果中该点处的像素值,取最大的值所在的卷积结果,令该卷积结果在 (i, j)处的值等于G(i, j),令另外7个卷积结果在(i, j)处的值为0。
也就是只保留每个点附近最强烈最明显的方向的轮廓特征,以此来达到降噪的目的。
(2)合并卷积结果
将上述8个处理后的卷积结果分别与他们对应方向的归一化卷积核再次进行卷积。最后将这次得到的8个新的卷积结果叠加为一张图片。
再次卷积的目的是进一步提纯轮廓特征,使得降噪更加彻底。从而最大限度的避免细碎边缘的产生。
4. 反色输出
至此,核心运算完成。但是此时图片底色是黑色,因为上述过程导致边缘以外的像素值为0,也就呈现黑色。所以最后要进行反色,使之变为白色背景黑色线条。反色操作非常简单,在uint8格式下将每个像素值替换为255和它的差值即可,这样就实现了黑白翻转。
最后,将所有像素值映射到[0, 1]区间,就得到了最终的线描效果图。使用原论文中的图片进行实验,效果图及与原论文结果对比如下:
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
5. 结论及分析
(1)本文实验效果相对弱于原论文中的效果,可能是因为原论文使用了一些未提及的图像增强方法来进行预处理,比如锐化。事实上,本文在实验时也进行了一定程度的锐化预处理,否则得到的边缘很不明显。
(2)本文实验显示,该算法得出的线描效果的确比一般的边缘检测算法更接近于手绘效果,比如笔画之间有自然的重叠、交错和断开。
我会在下一篇文章里讲解该论文的第二大部分 -- 色调 / 阴影的绘制
顺便,如果有其他有趣的论文或者想法,欢迎提议~
6. 引用
[1] Lu, Cewu, Li Xu and Jiaya Jia. “Combining sketch and tone for pencil drawing production.” Expressive (2012).
MATLAB 长度和像素_MATLAB图像处理:把照片变成素描风格 V2 (1) 线描相关推荐
- MATLAB 长度和像素_matlab之随心所欲创建QR二维码
导 LEAD 语 感谢关注matlab爱好者公众号!如果公众号文章对您有帮助,别忘了点击分享和"在看"哦!若您对公众号有什么意见或建议,请在公众号中回复或在任意文章底部留言! 二维 ...
- MATLAB 长度和像素_MATLAB——单车道NaSch模型
先上一个输出的时空图 时空图 以下是代码 clear 刚学MATLAB,写了单车道的NaSch模型练练手,暂时还有几个问题: 首先就是关于车辆投放的问题,目前采用的是最开始一次性投放若干车辆,如要比较 ...
- MATLAB 长度和像素_Matlab中短时傅里叶变换 spectrogram和stft的用法
在Matlab中,做短时傅里叶变换需要使用函数spectrogram,而在Matlab2019中,引入了一个新的函数stft,下面我们就来看下这两个函数都如何使用. 短时傅里叶变换的基本原理就是将数据 ...
- matlab连通区边界_Matlab图像处理学习笔记(一):二值化、开操作、连通区域提取、重心、ROI...
本博客主要记录我学习运用matlab进行一些基本的图像处理的一些笔记,如果有不当的地方,欢迎批评指正,一起学习,一起进步. 本篇是第一篇,只涉及到一些基本的操作,涉及到的知识点如下: 1.二值化 2. ...
- matlab 判断元素索引_MATLAB图像处理:08:在交通视频中检测汽车
本示例说明如何使用"图像处理工具箱"来可视化和分析视频或图像序列.本示例使用VideoReader(MATLAB),implay和其他图像处理工具箱功能来检测交通视频中的浅色汽车. ...
- matlab里toimage函数_MATLAB图像处理函数大全
Import, Export, and Conversion Read and Write Image Data from Files imread Read image from graphics ...
- MATLAB 长度和像素_气象编程 | Matlab教程:nc文件的打开和使用m_map绘制海温图
添加新云天气象主编微信或QQ:130188121,及时获取或发布气象升学.就业.会议.征稿及学术动态等信息! 近期招聘.培训安排(点击图片了解详情): 在大气科学中,matlab可以用于小规模的科学计 ...
- Python 照片转换为素描风格并保存
import cv2 img = cv2.imread("E:\\images\\10.jpeg")#自己电脑图片路径加文件名称和格式## 将照片灰度化处理 gray_image ...
- 用matlab写的视频截取图像桢,基于MATLAB的储粮害虫图像处理方法
摘要:在对粮虫图像处理过程中,介绍了Matlab图像处理工具箱中的函数,给出了图像处理 与分析的技术实现, 边缘检测及轮廓提取, 通过形态学方法进行图像特征抽取与分析,达到了比较好的效果. 关键词:粮 ...
最新文章
- Kali Linux软件更新日报20190623
- ArcGIS 基础11-专题制图
- 根据DLL创建LIB输出库的方法
- HDU ACM Steps攻略 ACM Steps的全部内容
- win7·64bit+VS2013+opencv的简单配置
- [置顶] 让我爱恨的ThinkPHP Relation
- “滚!”央视、腾讯暂停NBA季前赛转播,NBA被中国市场“下架”!
- 苹果误用美元结算工资,中国开发者们“暴富”:感动却不敢动啊!
- 与你邂逅——软件工程
- 未来教育考试系统V4.0——安装后双击打不开
- 阿里云邮箱推送发送邮件 25端口禁用 问题
- tolua++ 参考手册
- 英语词汇篇 - 词根词缀大全
- 掌财社:央行重磅数据出炉 M2增速大降3个百分点 社融增量仅1.85万亿 释放什么信号?
- 长沙民政职业技术学院计算机网络技术专业,长沙民政职业技术学院计算机网络技术专业...
- 黑客用我们服务器挖矿了
- RK61键盘配置方法
- 自制密码生成器1.0
- 用示波器实现跳舞视频
- 怎么清晰地理解、表达 IaaS 、 PaaS 、 SaaS ?