Python PIL画像処理---画像の手描き効果

4530 ワード

まず、私たちが普段使っているカラー画像はRGB色で、red(0-255)、green(0-255)、blue(0-255)の3つの画像チャネルがあります.1枚の画像を1つの2次元マトリクスとして理解することができ、マトリクスの各点にはRGB色の属性があり、1つの画像2を構成する.対応画素点の対応値を変更するだけで、1枚の画像を操作できます.
2つの画像変換の例を次に示します.
1.これは通常、1枚のカラー画像を各画素点の操作によって反対の色に変えるものである.
from PIL import Image
import numpy as np
a=np.array(Image.open('001.jpg'))
print(a.shape,a.dtype)
b=[255,255,255]-a
im=Image.fromarray(b.astype('uint8'))
im.save('002.jpg')

2.画像の白黒変換です.
from PIL import Image
import numpy as np
a=np.array(Image.open('001.jpg').convert('L'))#.convert      

b=255-a#                      
im=Image.fromarray(b.astype('uint8'))
im.save('003.jpg')


c=(100/255)*a+150#    ,           
im=Image.fromarray(c.astype('uint8'))
im.save('004.jpg')

d=255*(a/255)**2#    ,       
im=Image.fromarray(d.astype('uint8'))
im.save('005.jpg')


3.画像の手描き効果の変換:
コードを先に入力:
from PIL import Image
import numpy as np
a=np.array(Image.open('  .jpg').convert('L')).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.2                        #       ,   
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)      #     
b=b.clip(0,255)

im=Image.fromarray(b.astype('uint8'))
im.save('    .jpg')    

コード解析:
階調変化に基づいて人間の視覚の遠近度をシミュレートする
  • は、画像の斜め上に位置する仮想光源
  • を設計する.
  • 光源の画像に対する平面視角はElevation、方位角はAzimuth
  • である.
  • 個の点勾配値に対する光源の影響関数
  • を確立する.
  • 各点の新しい画素値
  • を演算する.