DAY20 图片处理套件-OpenCV

昨天我们介绍了深度学习的概念和应用,今天来介绍一下图片的处理,前一章我们有提到,一张图片对於神经网路来说就是很多像素组成的矩阵,为了让神经网路能够学习它,我们必须将图片进行一些处理动作,这也是我们在进行任何图片分类的专案前要先做的,类似於机器学习的资料前处理。


一、图片组成

首先介绍一下图片的组成,一张图片是由mn个像素(pixels)组成的,可以把像素想像成一种颜色的小格子,组成起来就是一张图片,一张图片的资讯如下:

Size:图片的大小,图片是二维的,大小的表示就是Length*Width
Channel:通道数,简单来说就是几种基本颜色组成的,一般的彩色照片通道数就是3(RGB)
Shape: 图片的完整信息,包括Size及Channel数,EX: (Length,Width,Channel)


二、处理套件-OpenCV

OpenCV是目前相当广泛的图片处理套件,它包括简单的图片基本处理,也有较进阶的使用方法,因为很多人使用,因此在网路上也找的到很多资源,相当方便,下面就带大家进行一些简单的处理。

要使用此套件前需先下载资源包(Anaconda)

conda install opencv

载入套件

import cv2  #图片处理
import matplotlib.pyplot as plt  #画出图片

读取图片,这边可以看到读进来的图片会以阵列显示像素

img = cv2.imread("husky.jpg")
img

https://ithelp.ithome.com.tw/upload/images/20210920/20140427HH0IeVN6mU.jpg

显示图片

plt.imshow(img,cmap=None) #参数cmap是输出照片的颜色,如果是黑白照片要设为灰阶图"gray"

https://ithelp.ithome.com.tw/upload/images/20210914/20140427rR6019wVGL.jpg

查看图片资讯(shape,资料型态,最大最小像素值)

print(f"image shape: {img.shape}")
print(f"data type: {img.dtype}")
print(f"min: {img.min()}, max: {img.max()}")

https://ithelp.ithome.com.tw/upload/images/20210914/20140427cD5elNnc1b.jpg

缩放图片

img=cv2.resize(img,(512,512))

三、进阶图片处理

直方图均衡化(Histogram Equalization)

前面有介绍过直方图的用途,可以方便我们看出资料像素分布的状况(0-255),我们可以了解到这张影像是偏亮或偏暗,以便去做处理。

plt.hist(img.reshape(-1), bins=50)
plt.xlabel("pixel value", fontsize=14)
plt.ylabel("Frequency", fontsize=14)

https://ithelp.ithome.com.tw/upload/images/20210914/20140427CbVYj7cCwL.jpg
我们都知道像素为0是黑色,255是白色,因此直方图的峰值若靠近左侧(0),代表影像整体偏暗,靠印右侧(255)代表整体偏亮,如果集中在中间,代表整张图的明暗对比不明显,而直方图最理想的状况就是平均分布,因此我们会倾向将图片实施直方图均衡化,让它平均分布在0到255之间。

这边我们就不具体说明它的演算方式,直接以程序码来做示范。

这边我们以一张灰阶图做示范

#Histogram Equalization
equalize_img = cv2.equalizeHist(img) 

plt.figure(figsize=(14, 9))
plt.subplot(2, 2, 1)
plt.imshow(img, cmap="gray")
plt.axis("off")
plt.title(f"Original")

plt.subplot(2, 2, 2)
plt.imshow(equalize_img, cmap="gray")
plt.axis("off")
plt.title(f"Histogram")

plt.subplot(2, 2, 3)
plt.hist(img.reshape(-1), bins=50)
plt.xlabel("pixel value", fontsize=14)
plt.ylabel("Frequency", fontsize=14)

plt.subplot(2, 2, 4)
plt.hist(equalize_img.reshape(-1), bins=50)
plt.xlabel("pixel value", fontsize=14)
plt.ylabel("Frequency", fontsize=14)
plt.show()

https://ithelp.ithome.com.tw/upload/images/20210914/20140427j3Z6xJ4nNs.jpg
可以看到经过直方图均衡化後,像素分布更为平均,明暗对比也提高了许多。

局部均衡化(createCLAHE)

使用Histogram Equalization是对全局图片进行调整,因此也会存在着一些问题,像是因为整体影像的亮度增加,可能有些小地方会变得模糊,因此有了另一种方法:createCLAHE,这种方法是对部分影像分别做均衡化,限制局部明暗对比太大的状况。

clahe = cv2.createCLAHE()
clahe_img = clahe.apply(img)

plt.figure(figsize=(20, 12))
plt.subplot(2, 3, 1)
plt.imshow(img, cmap="gray")
plt.axis("off")
plt.title(f"Original")

plt.subplot(2, 3, 2)
plt.imshow(equalize_img, cmap="gray")
plt.axis("off")
plt.title(f"Histogram")

plt.subplot(2, 3, 3)
plt.imshow(clahe_img, cmap="gray")
plt.axis("off")
plt.title(f"CLAHE")

plt.subplot(2, 3, 4)
plt.hist(img.reshape(-1), bins=50)
plt.xlabel("pixel value", fontsize=14)
plt.ylabel("Frequency", fontsize=14)
plt.title(f"Original")

plt.subplot(2, 3, 5)
plt.hist(equalize_img.reshape(-1), bins=50)
plt.xlabel("pixel value", fontsize=14)
plt.ylabel("Frequency", fontsize=14)
plt.title(f"Histogram")

plt.subplot(2, 3, 6)
plt.hist(clahe_img.reshape(-1), bins=50)
plt.xlabel("pixel value", fontsize=14)
plt.ylabel("Frequency", fontsize=14)
plt.title(f"CLAHE")
plt.show()

https://ithelp.ithome.com.tw/upload/images/20210914/20140427N4gBafO2po.jpg


四、结论

今天介绍了图片处理套件Opencv以及一些基本的影像处理方法,可以把这个步骤视为影像资料的前处理,我们也可以进一步了解接下来要处理的影像,若一开始能把影像处理的妥当,在丢给神经网路学习时也会得到较好的效果。


<<:  Spring Framework X Kotlin Day 15 AOP

>>:  铁人赛 Day20-- 为我们的登入者介面增加登入功能(PHP & MySql) --完成登入功能

【Day 02】战略资讯系统(Strategic information system)

战略资讯系统 中台架构其实是一种整体资讯架构订定的思维,其目的是为了迎接企业不断创新的挑战,在『变是...

Seo到底怎麽做?需要请网路行销公司来操作吗?

seo怎麽做,许多策略可以帮助您更好地排列与您的产品和行业相关的竞争关键字。然而这需要请网路行销公司...

Day 14 -资料查询语言 LIKE !

LIKE 运算子搭配 WHERE 子句可以依一特定模式 (Pattern) 为条件来搜寻资料表中的特...

[Day 27] Partitioning (1) - Partitioning of key-value data

Day 21 ~ Day 26 我们讨论了如何将资料分散到不同节点的 Replication,对那些...

Day 05 Decorator

Decorator(装饰器) 是 Python 中很好用的一个东西,只要 @ 一下就可以处理掉很多东...