Python——彩圖變線稿


 

思路:

1、用灰度變化來模擬視覺的明暗程度;

2、把彩圖轉為灰度數組;

3、求出梯度數組,即灰度變化率數組;

4、預設灰度值10,范圍0-100,衰減到10%,這將對灰度變化率按作衰減;

5、令z變化率為1,對x、y、z的作歸一化處理;

6、定義一個光源,附視角接近90度,方位角45度;

7、令對角線長度為單位1,分別計算光源在x、y、z軸的投影值;

8、將歸一化並衰減過的灰度變化率,分別乘以對應的投影值,之后相加;

9、得到灰度系數,再乘以255,即線稿的灰度值;

10、輸出線稿圖;

 

代碼如下:

#coding=utf-8

from PIL import Image 
import numpy as np

orgimg = '/Users/chong/Documents/code/ai/gray/t1/res/card_100023.png'
outimg = '/Users/chong/Documents/code/ai/gray/t1/res/card_100023_gray.png'
a = np.asarray(Image.open(orgimg).convert('L')).astype('float')

# 根據灰度變化來模擬人類視覺的明暗程度
depth = 10.             # 預設虛擬深度值為10 范圍為0-100 
grad = np.gradient(a)   # 提取梯度值
grad_x, grad_y = grad   # 提取x y方向梯度值 解構賦給grad_x, grad_y

# 利用像素之間的梯度值和虛擬深度值對圖像進行重構
grad_x = grad_x * depth / 100.
grad_y = grad_y * depth / 100. #根據深度調整x y方向梯度值

# 梯度歸一化 定義z深度為1.  將三個梯度絕對值轉化為相對值,在三維中是相對於斜對角線A的值
A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
uni_x = grad_x / A 
uni_y = grad_y / A 
uni_z = 1./ A

# 令三維中是相對於斜對角線的值為1
vec_el = np.pi / 2.1                    # 光源俯視角度   弧度值  接近90度
vec_az = np.pi / 4.                     # 光源方位角度   弧度值  45度
dx = np.cos(vec_el) * np.cos(vec_az)    # 光源對x軸的影響 對角線在x軸投影
dy = np.cos(vec_el) * np.sin(vec_az)    # 光源對y軸的影響 對角線在y軸投影
dz = np.sin(vec_el)                     # 光源對z軸的影響 對角線在z軸投影

b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z) # 光源歸一化
b = b.clip(0, 255)                               # 為了避免數據越界,生成灰度值限制在0-255區間
im = Image.fromarray(b.astype( 'uint8'))         # 圖像更構 
im.save(outimg)       # 保存圖片

 

運行   python pic-gray.py 

效果圖

  

 

相關庫安裝  pip install numpy

取灰度圖方法

1. img = img.convert()
  PIL有九種不同模式: 1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。

1.1 img.convert('1')
  為二值圖像,非黑即白。每個像素用8個bit表示,0表示黑,255表示白。

1.2 img.convert('L')
  為灰度圖像,每個像素用8個bit表示,0表示黑,255表示白,其他數字表示不同的灰度。

   轉換公式:L = R * 299/1000 + G * 587/1000+ B * 114/1000。

1.3 img.convert('P')

 ps:

顯示圖片

import matplotlib.pyplot as plt
plt.figure("preview")
plt.imshow(Image.open(outimg))
plt.show()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM