您的位置:首页 > 编程语言 > Python开发

如何通过PYthon进行图像的暗化处理

2018-01-12 11:47 295 查看
如何使用python的numpy和python库中的PIL中的Image类进行图像的手绘处理

1. 手绘的情况要考虑原图的明暗程度以及光照的影响。

2. 图像的明暗程度的变化可以用grad u(i,j,k)梯度进行表示,直接调用numpy中的gradient(a)即可对ndarray数组进行梯度化

3.通过降维度函数convert('L'),将图像数组降为二维,进行灰度化

4.将光源效果,与深度depath对梯度的影响进行叠加

5.将处理后的数组通过Image.fromarray函数进行生成

im =np.array(Image.open('D:/dmeo.jpg').convert("L")).astype('float')

depath = 5 #对图像进行灰度降解的程度

grad = np.gradient(im) #计算图像对应的二维矩阵中的各个元素对应的梯度值,根据变化率来对各个像素点进行单位归一化

grad_x,grad_y = grad # x,y轴上面的梯度值,主要用来表示灰度的变化率

grad_x = grad_x*depath/100 #根据深度调整X,Y上的梯度值,进而影响灰度

grad_y = grad_y*depath/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.2

vec_ez = np.pi/4.

#下面分别是对X,Y,Z轴上面的影响

dx = np.cos(vec_el)*np.cos(vec_ez)

dy = np.cos(vec_el)*np.sin(vec_ez)

dz = np.sin(vec_el)

#将虚拟深度都灰度的影响以及光暗程度对灰度的影响叠加起来,并进行归一化

c = 255*(uni_x*dx+uni_y*dy+uni_z*dz)

#为了防止越界,进行区间裁剪

c = c.clip(0,255)

d = Image.fromarray(c.astype('uint8'))

d.save('D:/hello.png')

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息