数字图像处理书本的学习已经过去一段时间了。该文算是对过去所学的一些总结,一方面是为了加深对数字图像处理相关知识的理解,另一方面也希望能摆脱书本的信息茧房,更加“自由”的进行编程,涉猎书本以外或是之前没学明白的知识。本人才疏学浅,文中涉及操作都较为简单,根本目的是为了将来可能的科研工作打好基础,还请读者多多担待。
目录
一 图像的读、改、写
1.图像读取的常用方法
(1)PIL
利用PIL中Image函数,该函数不返回numpy对象,需要进行转换后输出。
import numpy as np
from PIL import Image
img1 = Image.open('image/1.jpg')
print(img1)
# 显示图像
img1.show()
# Image函数读取出的不是array格式(不返回numpy对象),因此需要进行转换
img1_array = np.array(img1)
# 输出分辨率及通道数
print(img1_array.shape)
可以得到的信息有:图像格式为RGB、分辨率1078×1078、三通道。
(2)matplotlib
该方式读取出来就是numpy对象,直接输出结果为图像的像素值。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
img1 = mpimg.imread('image/1.jpg')
print(img1.shape)
print(img1)
plt.imshow(img1)
plt.show()
输出除了得到分辨率和通道数以外,还得到了大量的矩阵,这些矩阵实际表示了图像的像素值。
以该图像为例,1078×1078分辨率表示图像由1078(行)×1078(列)像素构成,而RGB图像的每一个像素点的颜色由R、G、B三种颜色分量组成,每个分量值的范围为[0,255]。这个原理反映到输出结果中,即图中红色框矩阵表示第一个像素RGB值,蓝色框表示第一行像素RGB值,黄色框表示图像全部像素的RGB值。
(3)opencv-python
读取出来图片格式numpy,图像数据以BGR格式存储。
import cv2
img1 = cv2.imread('image/1.jpg')
print(img1)
# 命名窗口 namedWindow()函数的使用:https://blog.csdn.net/xykenny/article/details/90513480
cv2.namedWindow("AvA")
# 显示图像
cv2.imshow("AvA",img1)
cv2.waitKey()
可以看到输出的矩阵值发生了变化,是以BGR输出。
opencv也可以读取不同的图像颜色类型:
import cv2
img1 = cv2.imread('image/1.jpg',1)# 读取彩色图像
img1 = cv2.imread('image/1.jpg',0)# 读取灰度图像
img1 = cv2.imread('image/1.jpg',-1)# 按图片原有格式进行读取
由于imread读取默认为三通道图片,因此对于二值图像,只能通过按原格式进行读取,否则图片会被自动转换为三通道图片。
2.图像修改操作
(1)像素颜色改变
下面是一段对读取图像进行修改像素颜色的操作,主要涉及了读取图像尺寸,改变对应像素RGB值。
from PIL import Image
img1 = Image.open('image/1.jpg')
pix = img1.load() # 导入像素
width = img1.size[0] # 获取宽度
height = img1.size[1] # 获取长度
temp = 1
for x in range(width): # 遍历宽度
temp += 1
for y in range(height): # 遍历长度
if temp % 5 == 0: # 每隔5个像素点就涂黑一个点
img1.putpixel((x,y),(0,0,0))
img1.show()
(2)图像缩放平移旋转
import cv2
import numpy as np
img1 = cv2.imread('image/1.jpg')
rows,cols,channel = img1.shape # 获取原始长宽通道数
img11 = cv2.resize(img1,(500,300)) # 缩放为500×300分辨率
img12 = cv2.resize(img1,(int(cols*0.3),int(rows*0.6))) # 按比例缩放
M1 = cv2.getRotationMatrix2D((cols/2,rows/2),60,0.5) # 定义旋转参数,第一个参数为旋转中心,第二个为角度,第三个为旋转后缩放比例
img13 = cv2.warpAffine(img1,M1,(cols,rows)) # 第一个参数为图像,第二个为旋转参数,第三个为图像宽高
M2 = np.float32([[1,0,0],[0,1,300]]) # 定义平移参数
img14 = cv2.warpAffine(img1,M2,(cols,rows))
img15 = cv2.flip(img1,0) # 0以x轴为对称轴翻转,>0以y轴为对称轴翻转,<0以x轴y轴翻转
cv2.imshow("resize1",img11)
cv2.imshow("resize2",img12)
cv2.imshow("rotation",img13)
cv2.imshow("move",img14)
cv2.imshow("flip",img15)
cv2.waitKey()
图片比较多就不贴出来了。读者可以参考代码段中的注释,修改部分参数,观察效果。
3.图像保存操作
(1)使用PIL库
以之前修改像素的结果为例,保存图像到本地。我们读取的是jpg格式图片,但也可以以其他格式保存。
from PIL import Image
img1 = Image.open('image/1.jpg')
pix = img1.load() # 导入像素
width = img1.size[0] # 获取宽度
height = img1.size[1] # 获取长度
temp = 1
for x in range(width): # 遍历宽度
temp += 1
for y in range(height): # 遍历长度
if temp % 5 == 0: # 每隔5个像素点就涂黑一个点
img1.putpixel((x,y),(0,0,0))
img1.save('image/11.png') # 保存png图片
(2)使用OpenCV库
import cv2
img1 = cv2.imread('image/1.jpg')
img_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) # 转化为灰度图
print(img_gray) # 输出灰度图像素值
cv2.imwrite('image/11.jpg', img_gray)
img11 = cv2.imread('image/11.jpg')
print(img11) # 输出保存图像像素值
imread读取的是三通道图像,而imwrite也只能保存BGR三通道图像,所以即便将原图像转化为灰度图,保存后的图像也仍然是RGB图像。这点可以通过输出图像进行验证,img_gray一个值对应一个像素,是单通道;img11三个值对应一个图像,是三通道。