这里记录下遇到的问题日后学习中填坑。上图片:

image

image

图像的手绘风格是图像灰度化后,由立体效果和明暗效果叠加而成。

立体效果

立体效果由添加虚拟深度值来实现。深度值乘以方向梯度值,来添加深度对于梯度的影响因素。

depth = 10\. # (0-100)

grad = np.gradient(a) #取图像灰度的梯度值

grad_x, grad_y = grad #分别取横纵图像梯度值

grad_x = grad_x*depth/100.

grad_y = grad_y*depth/100.

A = np.sqrt(grad_x**2 + grad_y**2 + 1.) #将梯度转为单位向量

uni_x = grad_x/A

uni_y = grad_y/A

uni_z = 1./A

灰度代表图像的明暗变化,而梯度值就是灰度的变化率。我们可以调整像素的梯度值来间接改变图片的明暗程度,立体效果由添加虚拟深度值来实现。深度值乘以方向梯度值,来添加深度对于梯度的影响因素。

这里尚不清楚这个深度值depth指的是什么,百度的图像深度值是指单个像素存储的位数如8位有0~255。从计算上直观来看这里的深度值越大,重建图像的像素值就越低图片越灰暗。

并且不清楚为什么要把梯度向量拓展到三维,猜测是因为要在下一步中模拟明暗效果。

如果将深度值depth设置为90,重建的图像是这样的

image

明暗效果

image

图为模拟光源存在,计算光源对各个坐标轴上的影响因子。这里我们取Elevation为80°,Azimuth为45°。dx,dy,dz为光源对x,y,z轴的影响因子,值均在0~1之间。个人的理解是dx,dy,dz是光线向量在像素点构成的坐标系上各坐标轴的分量,没能理解为什么可以是光源对坐标轴的影响因子并在之后乘以梯度可以添加明暗效果。

vec_el = np.pi/2.25 # 光源的俯视角度(80°),弧度值

vec_az = np.pi/4. # 光源的方位角度(45°),弧度值

dx = np.cos(vec_el)*np.cos(vec_az) #光源对x 轴的影响

dy = np.cos(vec_el)*np.sin(vec_az) #光源对y 轴的影响

dz = np.sin(vec_el) #光源对z 轴的影响

若不使用上述代码,直接按照梯度重建的图像是这样的

image

可以看到图像比之前加上明暗效果的图片更灰暗。猜测是因为梯度x,y中有很多负值而z中都是趋向1的浮点数,乘上dx、dy、dz其实是让最后重建的像素值变大了即提亮了图像。

图像重建

b = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #单位梯度乘以光源在每个坐标轴上的影响因子后缩放回[0,255]

b = b.clip(0,255)

c = b.astype(np.uint8)

对于重建是用类似L1范式的方式原因还未知晓。等日后学到图像重建时再填坑。

如果我将第三个维度dz*uni_z去掉进行重建,得到的图像是这样的

image

因为最后少了一项像素值变小了,图片变得灰暗了。

总结

中给出了代码和一定的解释,但对于为什么要这样处理无法理解。整体上来看求出梯度后每一步都是在降低重建图像的像素值从而提亮图像。

这里先留下一些相关链接,日后填坑

以下完整代码

import cv2

import numpy as np

a= cv2.imdecode(np.fromfile("C:/Users/tianchen/Desktop/gakki.JPG"),0).astype('float')

depth = 10. # (0-100)

grad = np.gradient(a) #取图像灰度的梯度值

grad_x, grad_y = grad #分别取横纵图像梯度值

grad_x = grad_x*depth/100.

grad_y = grad_y*depth/100.

A = np.sqrt(grad_x**2 + grad_y**2 + 1.) #将梯度转为单位向量

uni_x = grad_x/A

uni_y = grad_y/A

uni_z = 1./A

vec_el = np.pi/2.25 # 光源的俯视角度,弧度值

vec_az = np.pi/4. # 光源的方位角度,弧度值

dx = np.cos(vec_el)*np.cos(vec_az) #光源对x 轴的影响

dy = np.cos(vec_el)*np.sin(vec_az) #光源对y 轴的影响

dz = np.sin(vec_el) #光源对z 轴的影响

b = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #单位梯度乘以光源在每个坐标轴上的影响因子后缩放回[0,255]

b = b.clip(0,255)

c = b.astype(np.uint8)

cv2.namedWindow('gakki', cv2.WINDOW_NORMAL) #设置为WINDOW_NORMAL可以任意缩放

cv2.imshow('gakki', c)

cv2.waitKey(0)

cv2.destroyAllWindows()

cv2.imencode('.jpg', c)[1].tofile('C:/Users/tianchen/Desktop/gakki0.JPG' )

python图像手绘效果_python 3.6实现图像的手绘效果相关推荐

  1. python中的cv2模块能否保存图像的地理坐标信息_Python中plt.plot图像保存有白边,CV2.polyline,fillpoly的参数问题,图像保存颜色发生异常...

    Python中,如果你遇到了PIL图像保存有白边,CV2.polyline,fillpoly,参数问题,图像保存颜色发生异常这几个问题,这篇文章就能够解决你的疑惑. 第一个问题,plt图像保存有白边 ...

  2. python边缘检测画简笔画_python计算机视觉2:图像边缘检测

    标签: 我是一名初学者,如果你发现文中有错误,请留言告诉我,谢谢 如果需要检测到图像里面的边缘,首先我们需要知道边缘处具有什么特征. 对于一幅灰度图像来说,边缘两边的灰度值肯定不相同,这样我们才能分辨 ...

  3. python炫酷动画源代码_Python tkinter实现的图片移动碰撞动画效果【附源码下载】...

    本文实例讲述了Python tkinter实现的图片移动碰撞动画效果.分享给大家供大家参考,具体如下: 先来看看运行效果: 具体代码如下: #!/usr/bin/python # -*- coding ...

  4. python 图像处理与识别书籍_Python图像处理之识别图像中的文字(实例讲解)

    ①安装PIL:pip install Pillow(之前的博客中有写过) ②安装pytesser3:pip install pytesser3 ③安装pytesseract:pip install p ...

  5. tensorflow+python flask进行手写识别_python+flask搭建CNN在线识别手写中文网站!简直太屌了!...

    原标题:python+flask搭建CNN在线识别手写中文网站!简直太屌了! 使用python+flask搭建的一个网站,然后从网页的写字板上获取鼠标手写的汉字经过转码后传回后台,并经过图片裁剪处理之 ...

  6. python新手入门项目推荐_Python新手入门70个练手项目

    打开UC浏览器 查看更多精彩图片打开UC浏览器 查看更多精彩图片 不管学习哪门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行. 这里整理了70 ...

  7. python图片矫正后对比_python库skimage 对图像进行gamma校正和log校正

    Gamma校正 Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系: 这个指数即为Gamma. Gamma校正的原理很简单,就一个很简单的表达式,如下图所示: ...

  8. 如何用python画出一般函数图_python如何画函数图像

    通过图像可以直观地学习函数变化.分布等规律,在学习函数.概率分布等方面效果显著.下面我们尝试用Python的2D绘图库matplotlib来绘制函数图像. 下面我们来实现一个简单的函数: 首先,调用m ...

  9. python做图像处理快不快_Python 图像读写谁最快?不信就比一比

    图像处理,顾名思义,是对图像进行的各种转换.计算等处理.图像处理必不可少地需要读写图像文件. 图像文件的读取,就是将图像数据从磁盘中的文件内读入内存,之后按照图像解码标准解码,最后把图像各像素的值存储 ...

  10. python去除图像光照不均匀_python+opencv——去除图像光照不均匀

    使用python版本的opencv去除图像中的光照不均匀 在图像处理中,如果图像中存在光照不均匀,则会影响图像处理的效果,比如在图像文本识别和图像分割中.本博客对于图像均衡化的处理主要参考文章:一种基 ...

最新文章

  1. Exchange Server2013 系列十:证书的配置
  2. 看了毁你三观的PCB设计理论 高速PCB外层还要不要覆铜了
  3. C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数匹配与重载运算符
  4. unknown bottom blob ‘data‘ (layer ‘data_fixed‘, boblob ‘data‘ (layer ‘data_fixed‘, bottom index 0)
  5. javascript 获取应用程序根路径
  6. GridView实现数据编辑和删除(一)
  7. php yii把pdf转成图片,yii实现图片上传及缩略图生成的方法
  8. Unity3d-跨平台(二)
  9. 谷歌Chrome 81浏览器更新:新增微软Chromium版Edge现代Web控件
  10. Mysql学习总结(50)——Oracle,mysql和SQL Server的区别
  11. C# 在线培训之零基础入门 01:开篇及C#程序、解决方案的结构
  12. java day09【继承、super、this、抽象类】
  13. 从P1到P7——我在淘宝这7年(一)
  14. IDEA代码格式化会快捷键Ctrl+Alt+L失效
  15. mysql时间类型英文_英文日期格式及缩写
  16. 【数据结构基础_有[*pHead]和[*pEnd]的单向链表_(C++实现)】
  17. RHCE培训多少钱?
  18. 超声的pacs系统和dicom服务器,基于DICOM的PACS系统设计与实现
  19. js 数组 pop,push,unshift,splice,shift
  20. 信号带e无法连接服务器,手机信号栏突然出现“E”是啥意思?原来是这个问题,望周知...

热门文章

  1. matlab读取jpg图片出错,求助,Matlab读取图片进行分类。出现错误
  2. python和r语言对比_Python和R语言之分析对比
  3. CSS盒子模型、浮动+例子分析
  4. python爬虫--从企查查获取所有上市公司列表保存至json
  5. win10用win7的图片查看器
  6. 产品经理面试(题目+答案)
  7. reimage许可证密钥_2019年7月24日,绝对真实的许可证密钥
  8. php ctype xdigit,php ctype_digit() 函数介绍
  9. 通信协议之IIC总线
  10. 「 OptiTrack」搭建动作视觉运动捕捉系统教程