目录
1.1 PIL:Python图像处理类库
PIL(Python Imaging Library,图像处理类库)提供了通用的图像处理功能,以及大量有用的基本图像操作,比如图像缩放、裁剪、旋转、颜色转换等。PIL 是免费的,可以从http://www.pythonware.com/products/pil/下载。
1.1.1 图像的读取、显示和灰度图
import cv2 as cv
img_path = "R-C.jpg" #图片路径
img = cv.imread(img_path) #以BGR三通道读取图片数据
img_gray = cv.imread(img_path,cv.IMREAD_GRAYSCALE) #以灰度图像的形式获取图像(二维数组)
cv.namedWindow("Image")
cv.imshow("Image",img) #显示RGB图像
cv.imshow("img_gray",img_gray) #显示灰度图像
cv.imwrite("C:\\Users\\86177\\Pictures\\R-C huidu.jpg",img_gray) #储存图片
原图和灰度图的结果分别如下图所示:
1.1.2 创建图像缩略图
from PIL import Image
pil_im = Image.open('R-C.jpg')# 读取图像
pil_im.show()
pil_im.thumbnail((128,128))#创建128像素的缩略图
pil_im.show()
结果如下图所示,可以看出在相同尺寸的情况下,128像素的缩略图明显要比原图像模糊的多。
1.2 Matplotlib
Matplotlib主要的作用,是用来生成绘图,直方图,功率谱,条形图,错误图,散点图等,而Matplotlib是一个Python的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。
1.2.1 绘制图像点和线
# 使用matplotlib连线
from PIL import Image
from pylab import *
# 读取为列表,以便标记x、y的点.
im=array(Image.open('pic/kobe_mamba.jpg'))
imshow(im)
# 列表 包含四个点坐标
x=[100,100,400,400]
y=[200,500,200,500]
#红色叉型标出
plot(x,y,'rx')
# 连接坐标的前四个点的线
plot(x[:4],y[:4])
show()
1.2.2 图像轮廓和直方图
from PIL import Image
from pylab import *
im = array(Image.open('gaolou.jpg').convert('L'))
re_im = Image.open('gaolou.jpg')
subplot(131)
imshow(re_im)
subplot(132)
gray()
# 不使用颜色信息
contour(im, origin='image')
# 在原点的左上角显示轮廓图像
axis('off')
axis('equal')
subplot(133)
# 直方图绘制
hist(im.flatten(), 128)
show()
输出如下:
1.3 Numpy
Numpy是一个常用的Python科学技术库,通过它可以快速对数组进行操作,包括形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等。许多Python库和科学计算的软件包都使用Numpy数组作为操作对象,或者将传入的Python数组转化为Numpy数组,因此在Python中操作数据离不开Numpy。
1.3.1 灰度变换
from PIL import Image
import numpy as np
def img_inversion(img_path):
image = Image.open(img_path)
image.show()
img = np.array(image)
img1 = 256 - img - 1
img = Image.fromarray(np.uint8(img1))
img.show()
if __name__ == '__main__':
img_path = r'gaolou.jpg'
img_inversion(img_path=img_path)
1.3.2 直方图均衡化
from PIL import Image
from numpy import *
def histeq(im, nbr_bins=256):
#灰度图均衡化
# 计算图像的直方图
imhist, bins = histogram(im.flatten(), nbr_bins, normed=True)
cdf = imhist.cumsum()
#归一化
cdf = 255.0 * cdf / cdf[-1]
# 使用累积分布函数的线性插值,计算新的像素值
im2 = interp(im.flatten(), bins[:-1], cdf)
return im2.reshape(im.shape), cdf
imgs = Image.open('133.jpg') # 打开原图
imgs_gray = imgs.convert('L') # 转化为灰度图像
imgs_gray.show() # 显示灰度图像
imgs_gray.save("huidu.jpg")
im = array(Image.open('133.jpg').convert('L'))
im2, cdf = histeq(im)
im2 = Image.fromarray(uint8(im2))
im2.show()
im2.save("junheng.jpg")
1.4 Scipy
Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。
1.4.1 图像模糊
图像的高斯模糊是非常经典的图像卷积例子。本质上,图像模糊就是将(灰度)图像 I 和一个高斯核进行卷积操作。
import cv2
img = cv2.imread('gaolou.jpg')
cv2.imshow('img', img)
img2 = cv2.GaussianBlur(img, (51,51), 0, 0) # 可调整卷积核大小查看不同效果
cv2.imshow('imgBlur', img2)
cv2.waitKey(0)