【Python】圖片存取、相關灰度處理、手繪效果(PIL庫)

背景介紹

資源參考於:
Python數據分析與展示【北理工 嵩天】第一週實例

順便一提:
中國大學慕課,有的課程過期了不讓訪問。
這個課是我之前就報名參加的,所以現在可以直接訪問,有意思的是:好像別人點擊我的鏈接也是能訪問的。
當然,慕課上的“過期”課程網上有很多方法能訪問,這裏不做深入討論。

慕課上的教程挺詳細的,故這裏不作知識介紹了。

直接上完整代碼

下面的代碼與其說是我寫的,倒不如說是我整理的~
看在整理的還不錯的份上,發個“原創”不過分吧?

from PIL import Image
import numpy as np

def Change_Image1(im):#對圖片進行“高光”處理
    a=np.array(im)
    b=[255,255,255]-a  #計算補值
    im=Image.fromarray(b.astype('uint8'))  #還原爲原圖像類型
    im.save("Change_image1.jpg")  #保存到當前目錄下(絕對路徑)

def Change_Image2(im):#灰度變換(像照片底片)
    #彩色圖片生成灰度圖片,生成的是一個二維數組
    a=np.array(im.convert('L'))
    b=255-a  #對灰度值取反
    im=Image.fromarray(b.astype('uint8'))
    im.save("Change_image2.jpg")

def Change_Image3(im):#顏色比較淡的灰度圖片
    a=np.array(im.convert('L'))
    b=(100/255)*a + 150  #區間變換
    im=Image.fromarray(b.astype('uint8'))
    im.save("Change_image3.jpg")
    
def Change_Image4(im):#顏色比較暗的灰度圖片
    a=np.array(im.convert('L'))
    b=255*(a/255)**2  #像素平方
    im=Image.fromarray(b.astype('uint8'))
    im.save("Change_image4.jpg")
    
def Change_Image5(im):#將圖片轉爲手繪效果
    a = np.asarray(im.convert('L')).astype('float')   
    #根據灰度變化來模擬人類視覺的明暗程度
    depth = 10.0                        #預設深度值爲10,範圍(0-100)
    grad = np.gradient(a)               #提取圖像灰度的梯度值
    grad_x, grad_y = grad               #提取x和y方向的梯度值
    grad_x = grad_x*depth/100.0
    grad_y = grad_y*depth/100.0         #對x,y進行歸一化
    #根據灰度變化來模擬人類視覺的遠景程度
    A = np.sqrt(grad_x**2 + grad_y**2 + 1.0)
    uni_x = grad_x/A                    #圖像平面的單位法向量
    uni_y = grad_y/A
    uni_z = 1.0/A
    vec_el = np.pi/2.2                  #光源的俯視角度,弧度值
    vec_az = np.pi/4.0                  #光源的方位角度,弧度值
    dx = np.cos(vec_el)*np.cos(vec_az)  #光線在地面上的投影長度 
    dy = np.cos(vec_el)*np.sin(vec_az)   
    dz = np.sin(vec_el)                  
    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('Change_image5.jpg')                #保存到當前文件夾下

if __name__=='__main__':
    #在當前目錄下獲取圖片 "Latern.jpg"(打開圖片是公共操作,可在主函數重實現)
    im=Image.open( "Image_test.jpg")
    Change_Image1(im)           #對圖片進行“高亮”處理(高飽和讀,高對比度)
    Change_Image2(im)           #將圖片轉爲類照片底片色
    Change_Image3(im)           #將圖片轉爲淡灰色
    Change_Image4(im)           #將圖片轉爲暗灰色
    Change_Image5(im)           #將圖片轉爲手繪效果
    

BY THE WAY
如果想直接輸出圖片:

	im.show()

效果欣賞

涉及到圖片的代碼其實挺有意思的,而且博客也好寫,放幾張圖片內容就多了

原圖
截的壁紙一部分,沒想到還挺大
在這裏插入圖片描述
子函數1:“高光”處理
更酷炫了有沒有?
在這裏插入圖片描述

子函數2:“黑白高飽和”
有的ACGN文化中有的人眼轄了,靠“意念”感知周圍世界似乎就是這個感覺
在這裏插入圖片描述

子函數3:顏色比較暗淡的灰度
孤獨,滄桑
在這裏插入圖片描述

子函數4:灰度值比較暗的圖片
悽慘、悲涼
在這裏插入圖片描述

子函數5:手繪效果
emmmmm,可能是選圖的原因,效果馬馬虎虎吧。
感覺和QQ上編輯“手繪”效果差不多
在這裏插入圖片描述

我似乎之前也寫過關於Python處理圖片的博客?
還真有
額,其實很多時候我自己都不願意看自己的BLOGS😂
【Python】採用opencv庫的cv2.imread()方法讀圖片及其他嘗試(os.listdir()、cvc2.rezise() )

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章