昨天我们介绍了深度学习的概念和应用,今天来介绍一下图片的处理,前一章我们有提到,一张图片对於神经网路来说就是很多像素组成的矩阵,为了让神经网路能够学习它,我们必须将图片进行一些处理动作,这也是我们在进行任何图片分类的专案前要先做的,类似於机器学习的资料前处理。
首先介绍一下图片的组成,一张图片是由mn个像素(pixels)组成的,可以把像素想像成一种颜色的小格子,组成起来就是一张图片,一张图片的资讯如下:
Size:图片的大小,图片是二维的,大小的表示就是Length*Width
Channel:通道数,简单来说就是几种基本颜色组成的,一般的彩色照片通道数就是3(RGB)
Shape: 图片的完整信息,包括Size及Channel数,EX: (Length,Width,Channel)
OpenCV是目前相当广泛的图片处理套件,它包括简单的图片基本处理,也有较进阶的使用方法,因为很多人使用,因此在网路上也找的到很多资源,相当方便,下面就带大家进行一些简单的处理。
conda install opencv
import cv2 #图片处理
import matplotlib.pyplot as plt #画出图片
img = cv2.imread("husky.jpg")
img
plt.imshow(img,cmap=None) #参数cmap是输出照片的颜色,如果是黑白照片要设为灰阶图"gray"
print(f"image shape: {img.shape}")
print(f"data type: {img.dtype}")
print(f"min: {img.min()}, max: {img.max()}")
img=cv2.resize(img,(512,512))
前面有介绍过直方图的用途,可以方便我们看出资料像素分布的状况(0-255),我们可以了解到这张影像是偏亮或偏暗,以便去做处理。
plt.hist(img.reshape(-1), bins=50)
plt.xlabel("pixel value", fontsize=14)
plt.ylabel("Frequency", fontsize=14)
我们都知道像素为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()
可以看到经过直方图均衡化後,像素分布更为平均,明暗对比也提高了许多。
使用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()
今天介绍了图片处理套件Opencv以及一些基本的影像处理方法,可以把这个步骤视为影像资料的前处理,我们也可以进一步了解接下来要处理的影像,若一开始能把影像处理的妥当,在丢给神经网路学习时也会得到较好的效果。
<<: Spring Framework X Kotlin Day 15 AOP
>>: 铁人赛 Day20-- 为我们的登入者介面增加登入功能(PHP & MySql) --完成登入功能
战略资讯系统 中台架构其实是一种整体资讯架构订定的思维,其目的是为了迎接企业不断创新的挑战,在『变是...
seo怎麽做,许多策略可以帮助您更好地排列与您的产品和行业相关的竞争关键字。然而这需要请网路行销公司...
LIKE 运算子搭配 WHERE 子句可以依一特定模式 (Pattern) 为条件来搜寻资料表中的特...
Day 21 ~ Day 26 我们讨论了如何将资料分散到不同节点的 Replication,对那些...
Decorator(装饰器) 是 Python 中很好用的一个东西,只要 @ 一下就可以处理掉很多东...