Python圖像處理(一)【灰度化、二值化、灰度變換】


Python圖像處理(一)【灰度化、二值化、灰度變換】
1.灰度化
1.1浮點算法
1.2.整數算法
1.3.平均值法
1.4.移位法
1.5.單通道法(只取綠色通道)
2.二值化
2.1.取中間閥值127
2.2.取所有像素點灰度的平均值
3.灰度變換
3.1.反相
3.2.將像素值變換到100~200之間
3.3.將像素值求平方,使較暗的像素值變得更小
3.4.灰度變換函數對比

原圖如下

 

 

1.灰度化

 

 


參考《Python圖像灰度變換及圖像數組操作》實現以下幾種灰度化

獲取圖片及顯示圖片的通用方法如下:

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

#獲取圖片
def getimg():
return Image.open("f:/pic/timg.jpg")

#顯示圖片
def showimg(img, isgray=False):
plt.axis("off")
if isgray == True:
plt.imshow(img, cmap='gray')
else:
plt.imshow(img)
plt.show()

PIL庫自帶方法實現灰度化

im = getimg()
im_gray = im.convert('L')
showimg(im_gray, True)

1.1浮點算法
im = getimg()
im = np.array(im)
im[:,:,0] = im[:,:,0]*0.3
im[:,:,1] = im[:,:,1]*0.59
im[:,:,2] = im[:,:,2]*0.11
im = np.sum(im, axis=2)
showimg(Image.fromarray(im), True)

1.2.整數算法
im1 = getimg()
#創建數組時指定數據類型,否則默認uint8乘法運算會溢出
im1 = np.array(im1, dtype=np.float32)
im1[...,0] = im1[...,0]*30.0
im1[...,1] = im1[...,1]*59.0
im1[...,2] = im1[...,2]*11.0
im1 = np.sum(im1, axis=2)
im1[...,:] = im1[...,:]/100.0
showimg(Image.fromarray(im1), True)

1.3.平均值法
im2 = getimg()
im2 = np.array(im2, dtype=np.float32)
im2 = np.sum(im2, axis=2)
im2[...,:] = im2[...,:]/3.0
showimg(Image.fromarray(im2), True)

1.4.移位法
im3 = getimg()
im3 = np.array(im3, dtype=np.int32)
im3[...,0] = im3[...,0]*28.0
im3[...,1] = im3[...,1]*151.0
im3[...,2] = im3[...,2]*77.0
im3 = np.sum(im3, axis=2)

arr = [np.right_shift(y.item(), 8) for x in im3 for y in x]
arr = np.array(arr)
arr.resize(im3.shape)
showimg(Image.fromarray(arr), True)

1.5.單通道法(只取綠色通道)
im4 = getimg()
im4 = np.array(im4, dtype=np.int32)
im4[...,0] = 0
im4[...,2] = 0
im4 = np.sum(im4, axis=2)
showimg(Image.fromarray(im4), True)

2.二值化
2.1.取中間閥值127


im5 = getimg()
im5 = np.array(im5.convert('L'))
im5 = np.where(im5[...,:] < 127, 0, 255)
showimg(Image.fromarray(im5), True)

2.2.取所有像素點灰度的平均值


im = getimg()
im_gray1 = im.convert('L')
im_gray1 = np.array(im_gray1)
avg_gray = np.average(im_gray1)
im_gray1 = np.where(im_gray1[...,:] < avg_gray, 0, 255)
showimg(Image.fromarray(im_gray1), True)

3.灰度變換
3.1.反相


im = getimg()
im_gray = im.convert('L')
im_arr = np.array(im_gray)
im1 = 255 - im_arr
showimg(Image.fromarray(im1))

3.2.將像素值變換到100~200之間


im = getimg()
im_gray = im.convert('L')
im2 = (100.0/255)*im_gray +100
showimg(Image.fromarray(im2))

3.3.將像素值求平方,使較暗的像素值變得更小


im = getimg()
im_gray = im.convert('L')
im3 = 255.0*(im_gray /255.0)**2
showimg(Image.fromarray(im3))

3.4.灰度變換函數對比


plt.rcParams['font.sans-serif'] = ['SimHei']
plt.title('灰度變換函數圖像')
plt.xlabel('像素值')
plt.ylabel('變換后像素值')

x1 = np.arange(0, 256)
y1 = np.arange(0, 256)

f1, = plt.plot(x1, y1, '--')

y2 = 255 - x1
f2, = plt.plot(x1, y2, 'y')

y3 = (100.0/255)*x1 + 100
f3, = plt.plot(x1, y3, 'r:')

y4 = 255.0*(x1/255.0)**2
f4, = plt.plot(x1, y4, 'm--')
plt.legend((f1, f2, f3, f4), ('y=x','y=255-x','y=(100.0/255)*x+100','y=255.0*(x/255.0)**2'),loc='upper center')
plt.show()

————————————————
轉載鏈接:https://blog.csdn.net/lzwarhang/article/details/93209166


免責聲明!

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



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