使用matplotlib 、PIL 和opencv三种方法进行读取、保存、二值化、灰度化图片处理
文章目录
- 使用matplotlib 、PIL 和opencv三种方法进行读取、保存、二值化、灰度化图片处理
- 一、matplotlib
-
- 显示图片
- 显示图片的第一个通道
- 将 RGB 转为灰度图
- 对图像进行放缩
- 保存 matplotlib 画出的图像
- 二、PIL
-
- 显示图片
- 保存 PIL 图片
- 将 numpy 数组转换为 PIL 图片
- RGB 转换为灰度图、二值化图
- 三、opencv
-
- 读取图像,并把图像转换为灰度图像并显示
- 固定阈值二值化
- 算术平法的自适应二值化
- 高斯加权均值法自适应二值化
- 保存图片
- 创建于复制图片
一、matplotlib
显示图片
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
lena = mpimg.imread('lena.png')
lena.shape
plt.imshow(lena)
plt.axis('off')
plt.show()
显示图片的第一个通道
lena_1 = lena[:,:,0]
plt.imshow('lena_1')
plt.show()
plt.imshow('lena_1', cmap='Greys_r')
plt.show()
img = plt.imshow('lena_1')
img.set_cmap('gray')
plt.show()
将 RGB 转为灰度图
def rgb2gray(rgb):
return np.dot(rgb[...,:3], [0.299, 0.587, 0.114])
gray = rgb2gray(lena)
plt.imshow(gray, cmap='Greys_r')
plt.axis('off')
plt.show()
对图像进行放缩
from scipy import misc
lena_new_sz = misc.imresize(lena, 0.5)
plt.imshow(lena_new_sz)
plt.axis('off')
plt.show()
附上imresize的用法
功能:改变图像的大小。
用法:
B = imresize(A,m)
B = imresize(A,m,method)
B = imresize(A,[mrows ncols],method)
B = imresize(...,method,n)
B = imresize(...,method,h)
imrersize函数使用由参数method指定的插值运算来改变图像的大小。
method的几种可选值:
'nearest'(默认值)最近邻插值
'bilinear'双线性插值
'bicubic'双三次插值
B = imresize(A,m)表示把图像A放大m倍
B = imresize(...,method,h)中的h可以是任意一个FIR滤波器(h通常由函数ftrans2、fwind1、fwind2、或fsamp2等生成的二维FIR滤波器)。
保存 matplotlib 画出的图像
plt.savefig('lena_new_sz.png')
from scipy import misc
misc.imsave('lena_new_sz.png', lena_new_sz)
np.save('lena_new_sz', lena_new_sz)
img = np.load('lena_new_sz.npy')
二、PIL
显示图片
from PIL import Image
im = Image.open('lena.png')
im.show()
im_array = np.array(im)
保存 PIL 图片
from PIL import Image
I = Image.open('lena.png')
I.save('new_lena.png')
将 numpy 数组转换为 PIL 图片
import matplotlib.image as mpimg
from PIL import Image
lena = mpimg.imread('lena.png')
im = Image.fromarray(np.uinit8(lena*255))
im.show()
RGB 转换为灰度图、二值化图
from PIL import Image
I = Image.open('lena.png')
I.show()
L = I.convert('L')
L = I.convert('1')
L.show()
三、opencv
读取图像,并把图像转换为灰度图像并显示
import cv2
im = imread("./image.jpg")
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.axis("off")
cv2.title("Input Image")
cv2.imshow(im_gray, cmap="gray")
cv2.show()
固定阈值二值化
retval, im_at_fixed = cv2.threshold(im_gray, 50, 255, cv2.THRESH_BINARY)
cv2.axis("off")
cv2.title("Fixed Thresholding")
cv2.imshow(im_at_fixed, cmap = 'gray')
cv2.show()
cv2.threshold(src, thresh, maxval, type[, dst]) -> retval, dst
其中:
1、src 为输入图像;
2、thresh 为阈值;
3、maxval 为输出图像的最大值;
4、type 为阈值的类型;
5、dst 为目标图像。
1、cv2.THRESH_BINARY(黑白二值)
2、cv2.THRESH_BINARY_INV(黑白二值反转)
3、cv2.THRESH_TRUNC (得到的图像为多像素值)
4、cv2.THRESH_TOZERO
5、cv2.THRESH_TOZERO_INV
算术平法的自适应二值化
im_at_mean = cv2.adaptiveThreshold(im_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 10)
cv2.axis("off")
cv2.title("Adaptive Thresholding with mean weighted average")
cv2.imshow(im_at_mean, cmap = 'gray')
cv2.show()
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst
其中:
1、src 为输入图像;
2、maxval 为输出图像的最大值;
3、adaptiveMethod 设置为cv2.ADAPTIVE_THRESH_MEAN_C表示利用算术均值法,设置为cv2.ADAPTIVE_THRESH_GAUSSIAN_C表示用高斯权重均值法;
4、thresholdType: 阈值的类型;
5、blockSize: b的值;
6、C 为从均值中减去的常数,用于得到阈值;
7、dst 为目标图像。
高斯加权均值法自适应二值化
im_at_mean = cv2.adaptiveThreshold(im_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 7)
cv2.axis("off")
cv2.title("Adaptive Thresholding with gaussian weighted average")
cv2.imshow(im_at_mean, cmap = 'gray')
cv2.show()
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst
其中:
1、src 为输入图像;
2、maxval 为输出图像的最大值;
3、adaptiveMethod 设置为cv2.ADAPTIVE_THRESH_MEAN_C表示利用算术均值法,设置为cv2.ADAPTIVE_THRESH_GAUSSIAN_C表示用高斯权重均值法;
4、thresholdType: 阈值的类型;
5、blockSize: b的值;
6、C 为从均值中减去的常数,用于得到阈值;
7、dst 为目标图像。
保存图片
import cv2
cv2.imwrite("./new_img.jpg", img)
cv2.imwrite("./new_img.jpg", img,[int(cv2.IMWRITE_JPEG_QUALITY), 5])
创建于复制图片
emptyImage = np.zeros(img.shape, np.uint8)
emptyImage2 = img.copy();
emptyImage3=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)