第一种:手动方式,分别用plt实现(注意我用的图是4通道的,因此这种方式需要先转成3通道,再来灰度化,没有直接的rgba2gray);opencv实现;以及Image实现。
from skimage.color import rgb2gray, rgba2rgb
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import cv2
#手动二值化
def hand_binary():
"""使用plt读图处理图,"""
img = plt.imread("./data/cat.jpg")
"""此处plt.imread()读的图时四通道,需要先转成三通道,再转成灰度图"""
img = rgba2rgb(img) # 转成三通道图片
img_gray = rgb2gray(img) # 再来灰度化
rows, cols = img_gray.shape # 获取行数,列数
for i in range(rows):
for j in range(cols):
if (img_gray[i, j] >= 0.5): # 大于0.5给白色
img_gray[i, j] = 1
else: # 小于0.5给黑色
img_gray[i, j] = 0
plt.imshow(img_gray, cmap="gray")
plt.show()
"""opencv方式"""
img = cv2.imread('./data/cat.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转为灰度图
rows, cols = img_gray.shape[0:2]
thresh = 60 # 设置阈值
for row in range(rows):
for col in range(cols):
gray = img_gray[row, col] # 获取到灰度值
if gray > thresh:
img_gray[row, col] = 255 # 如果灰度值高于阈值 就等于255最大值
elif gray < thresh:
img_gray[row, col] = 0 # 如果小于阈值,就直接改为0
cv2.imshow('opencv_img', img_gray)
cv2.waitKey()
"""使用Image读图处理图"""
img = Image.open("./data/cat.jpg")
Img = img.convert('L') #L表示灰度
Img.show() #展示图象
threshold = 150 #设置一个阈值,
table = []
for i in range(256):
if i < threshold: #小于150给0
table.append(0)
else: #大于150给1
table.append(1)
img1 = Img.point(table, '1') #1表示二值图
img1.show()
if __name__ == '__main__':
hand_binary() #手动二值化
plt实现结果:
opencv实现结果
Image实现结果:
第二种:调用相关库实现二值化
# 调用库函数实现二值化
def auto_binary():
"""plt实现"""
img = plt.imread("./data/cat.jpg")
img_gray = rgb2gray(img) # 灰度化
img_binary = np.where(img_gray >= 0.5, 1, 0)
plt.imshow(img_binary, cmap='gray')
plt.show()
""""opencv实现"""
img = cv2.imread("./data/cat.jpg")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.threshold(img_gray, 127, 255, 0, img_gray)
cv2.imshow('img_binary', img_gray)
cv2.waitKey(0)
if __name__ == '__main__':
#hand_binary() # 手动二值化
auto_binary() # 调用库函数实现二值化
opencv库实现结果
plt库实现结果