数字图像处理笔记(Python)【1】

数字图像处理书本的学习已经过去一段时间了。该文算是对过去所学的一些总结,一方面是为了加深对数字图像处理相关知识的理解,另一方面也希望能摆脱书本的信息茧房,更加“自由”的进行编程,涉猎书本以外或是之前没学明白的知识。本人才疏学浅,文中涉及操作都较为简单,根本目的是为了将来可能的科研工作打好基础,还请读者多多担待。

目录

一、图像的读、改、写

1.图像读取的常用方法

(1)PIL

(2)matplotlib

(3)opencv-python 

2.图像修改操作

(1)像素颜色改变

(2)图像缩放平移旋转

3.图像保存操作

(1)使用PIL库

(2)使用OpenCV库


一 图像的读、改、写

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三个值对应一个图像,是三通道。

猜你喜欢

转载自blog.csdn.net/fjyalzl/article/details/126990753