Python图像处理(一)【灰度化、二值化、灰度变换】


原图如下
原图

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()
  • 64
    点赞
  • 424
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
Python中,可以使用PIL库来进行图像的灰度化二值化处理。首先,使用`Image.open()`函数打开图片,然后使用`convert()`方法将图片转换为灰度图像。例如,可以使用以下代码将图片转换为灰度图像: ```python from PIL import Image img = Image.open('pictures/学习资料.jpg') gray_img = img.convert('L') ``` 接下来,可以使用二值化的方法将灰度图像转换为二值图像。一种常用的方法是使用阈值来判断像素点的灰度值,大于阈值的像素点设为黑色,小于阈值的像素点设为白色。以下是一个示例代码: ```python threshold = 200 table = \[\] for i in range(256): if i < threshold: table.append(0) else: table.append(1) binary_img = gray_img.point(table, '1') ``` 在上述代码中,首先定义了一个阈值`threshold`,然后创建了一个空列表`table`。接着,遍历灰度值的范围(0-255),根据灰度值与阈值的比较结果,将对应的二值(0或1)添加到`table`列表中。最后,使用`point()`方法将灰度图像根据`table`列表进行二值化处理,得到二值图像`binary_img`。 请注意,以上代码仅为示例,实际应用中可能需要根据具体需求进行调整。 #### 引用[.reference_title] - *1* *3* [python图像灰度化二值化](https://blog.csdn.net/yky__xukai/article/details/110198864)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Python图像处理(一)【灰度化二值化灰度变换】](https://blog.csdn.net/lzwarhang/article/details/93209166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值