时间:2024-06-23 13:07:00
通过这篇文章,我们一起来学习一下:
使用PIL 和OpenCV 执行常见的图像处理技术,例如将RGB 图像转换为灰度图像、旋转图像、对图像进行去噪、查找图像中的边缘以及裁剪图像中的感兴趣区域。
使用OpenCV 的模板匹配查找图像中的对象。
安装所需的库:PIL、OpenCV、imutils
为什么我需要学习图像处理技术?
深度学习对于图像分析、识别和理解意义非常重要。图像分类、目标检测、实例分割等是深度学习在图像中的常见应用。为了能够构建更好的训练数据集,您首先需要深入了解基本图像处理技术,例如图像裁剪、图像去噪和图像旋转等图像增强。二次基本图像处理技术也有助于光学字符识别(OCR)。
图像处理技术通过识别图像中的关键特征或读取图像中的文本信息来改进图像的可解释性,以便对图像中存在的对象进行分类或检测。
图片来自Unsplash
代码和图片可以在这里找到
导入所需的库
import cv2from PIL import Image 首先使用OpenCV和PIL显示图像
使用OpenCV 读取和显示图像
image=cv2.imread(r'love.jpg')cv2.imshow('Image', image)cv2.waitKey(0) 如果图像太大,图像窗口和屏幕的显示比例将不匹配。
那么我们如何在屏幕上显示完整的图像呢?
默认情况下,当您查看超大图像时,图像会被裁剪,从而无法完整查看。以便能够确认
要显示整个图像,请使用OpenCV的namedWindow(name, flag)创建一个新窗口来显示图像。
第一个参数名称是窗口标题,用作标识符。 将标志设置为cv2.WINDOW_NORMAL 将显示整个图像并允许您调整窗口大小。当然,flag参数是可选的。
image=cv2.imread(r'love.jpg')cv2.namedWindow('普通窗口', cv2.WINDOW_NORMAL)cv2.imshow('普通窗口', image)cv2.waitKey(0)调整图像大小
调整图像大小时,您可以更改其高度或宽度,或同时更改高度和宽度,同时保持纵横比不变。图像的纵横比是图像的宽度与高度的比率。
image=cv2.imread(r'taj.jpg')scale_percent=200 # 原始尺寸的百分比width=int(image.shape[1] *scale_percent/100)height=int(image.shape[0] *scale_percent/100 ) dim=(width, height)resize=cv2.resize(image, dim, interpolation=cv2.INTER_AREA)cv2.imshow('Resize', resize)cv2.waitKey(0) 使用PIL读取图像,显示
使用open() 加载图像并使用show() 显示它。
使用image.show() 创建临时文件
pil_image=Image.open(r'love.jpg')pil_image.show('PIL Image') 如果您对图像中目标的边缘或其他特征感兴趣,如何识别它们?
灰度图像通常用于识别目标对象的边缘,因为它们不仅有助于理解图像内的对比度和阴影梯度,而且有助于理解图像特征。
与灰度图像的2D 通道相比,RGB 图像具有三个通道:红色、绿色和蓝色。灰度图像的每个像素信息比彩色图像少,因此灰度图像的处理时间更快。
使用OpenCV 对彩色图像进行灰度缩放
下面是如何使用cvtColor() 将彩色图像转换为灰度图像以及转换结果。
image=cv2.imread(r'love.jpg')gray_image=cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)cv2.namedWindow('灰度图像', cv2.WINDOW_NORMAL)cv2.imshow('灰度图像',gray_image)cv2 .waitKey(0)
灰度图像转换完成
使用PIL 对彩色图像进行灰度缩放
Convert() 提供了另一种转换此图像的方法。 “L”模式用于转换为灰度图像,“RGB”模式用于转换为彩色图像。
pil_image=Image.open(r'love.jpg')gray_pil=pil_image.convert('L')gray_pil.show() 使用OpenCV进行边缘检测
使用Canny 算子查找图像中的边缘。 Canny 边缘检测是使用高阶算法通过灰度图像执行的。
Canny():的第一个参数是输入图像,第二个和第三个参数是阈值1和阈值2值。
强度梯度大于阈值2 的边缘被视为边缘,强度梯度小于阈值1 的边缘被视为非边缘。除边线以外的任何内容都将被删除。两个阈值之间的梯度强度值根据连通性被分类为边缘或非边缘。
image=cv2.imread(r'taj.jpg')cv2.namedWindow('Edge', cv2.WINDOW_NORMAL) denoized_image=cv2.Canny(image, 100,200 )cv2.imshow('Edge', denoized_image)cv2.waitKey(0 )
Canny边缘处理
如果图像有一定程度的倾斜或旋转,应该如何调整?
OCR 不能很好地处理倾斜的文本,因此您需要修复原始图像。可以使用OpenCV 和PIL 的rotate() 来定向图像。
使用OpenCV 旋转图像
rotate() 根据函数第二个参数RotationCode 的值旋转图像。
旋转参数值为:
cv2.ROTATE_90_CLOCKWISE
cv2.ROTATE_90_COUNTERCLOCKWISE
CV2.ROTATE_180
image=cv2.imread(r'love.jpg')cv2.namedWindow('旋转图像', cv2.WINDOW_NORMAL)rotated_img=cv2.rotate(image,cv2.ROTATE_90_CLOCKWISE)cv2.imshow('旋转图像',rotated_img)cv2 .waitKey(0)
使用OpenCV 将图像顺时针旋转90 度
如果你想将图像旋转特定角度怎么办?
按照特定角度旋转图像
下面的代码以60 度的增量旋转图像。
将旋转()与imutils 一起使用
import imutilsimport numpy as npimage=cv2.imread(r'love.jpg')# np.arange(0, 360, 60) 循环旋转角度: 度cv2.namedWindow('Rotated', cv2.WINDOW_NORMAL)rotated=imutils.旋转(图像,角度)cv2.imshow('旋转',旋转)cv2.waitKey(0)
使用imutils 以60 度增量旋转图像
使用PIL 旋转图像
这里我们使用PIL将图像旋转110度
pil_image=Image.open(r'love.jpg')rotate_img_pil=pil_image.rotate(110)rotate_img_pil.show()
使用PIL 将图像旋转110 度
当图像因噪声而质量下降并影响图像分析时,如何提高图像质量?
使用OpenCV 进行图像去噪
就图像而言,噪声不是所需的信号。噪声会导致图像干扰和失真。
为了使用OpenCV 最小化图像中出现的噪声,首先输入噪声图像
image=cv2.imread(r'taj.jpg')cv2.namedWindow('有噪声的图像', cv2.WINDOW_NORMAL)cv2.imshow('有噪声的图像', image)cv2.waitKey(0)
OpenCV 有多种方法来去除图像中的噪声。使用cv.fastNlMeansDenoisingColored() 从彩色图像中去除噪声。
fastNIMeansDenoising函数的常用参数:
src:源图像
dst: 输出与src 大小和类型相同的图像
h: 调整过滤器强度。高h值可以完全去除噪声和图像细节,而低h值可以保留图像细节和部分噪声。
hForColorComponents: 与h相同,但仅针对彩色图像,通常与h相同
templateWindowSize: 默认0(推荐7)
searchWindowSize: 默认0(推荐21) image=cv2.imread(r'taj.jpg')cv2.namedWindow('去噪图像', cv2.WINDOW_NORMAL)denoized_image=cv2.fastNlMeansDenoisingColored(image,None, h=5)cv2.imshow ('去噪图像', enoized_image)cv2.waitKey(0) 如何从图像中提取特定的感兴趣区域?
裁剪图像
裁剪图像允许您提取图像中感兴趣的区域。
裁剪泰姬陵图像并删除图像中的其他细节,以便图像中仅保留泰姬陵。
使用OpenCV 裁剪图像
OpenCV 中的裁剪是通过对图像数组进行切片来完成的,首先传递开始和结束y 坐标,然后传递开始和结束x 坐标。
图像[y_start:y_end, x_start:x_end]
image=cv2.imread(r'taj.jpg')resize_img=image[15:170, 20:200]cv2.imshow('Resize', resize_img)cv2.waitKey(0) 使用PIL 裁剪图像
PIL 的Crop() 允许您裁剪图像的矩形区域。 Crop()的参数是矩形左上角和右下角的像素坐标。
pil_image=Image.open(r'taj.jpg')# 获取图像的大小(以像素为单位) width, height=pil_image.size# 设置裁剪图像的坐标left=3top=height /25right=200bottom=3 * height/4# 根据上述尺寸裁剪图像Cropped_image=pil_image.crop((left, top, right,bottom))# 在图像查看器中显示图像Cropped_image.show() 模板匹配
如果您提供模板,OpenCV 的matchTemplate() 将在图像中搜索它并提取其位置。
该模板像卷积神经网络一样在图像上滑动,并尝试将模板与输入图像进行匹配。
minMaxLoc() 用于获取最大/最小值。这从矩形的左上角开始,沿着宽度和高度取值。
模板匹配有六种方法。
CV2.TM_SQDIFF
CV2.TM_SQDI
CV2.TM_C
cv2.TM_CCORR_NORMED
CV2.TM_CCOEFF
cv2.TM_CCOEFF_NORMED
下面的示例通过从主图像中剪切一小部分来创建模板。
用于模板匹配的方法是TM_CCOEFF_NORMED。匹配阈值设置为0.95。如果匹配概率大于0.95,该函数将在匹配对应的区域周围绘制一个矩形。
import cv2import numpy as npfrom matplotlib import pyplot as pltimg=cv2.imread(r'love.jpg',0)cv2.imshow('main',img)cv2.waitKey(0)template=cv2.imread(r'template1. png',0)cv2.imshow('Template',template)cv2.waitKey(0)w, h=template.shape[:-1]methods=[ 'cv2.TM_CCOEFF_NORMED']method:'s meth=eval( meth) #应用模板匹配res=cv2.matchTemplate(img,template,method) min_val, max_val, min_loc, max_loc=cv2.minMaxLoc(res)threshold=0.95 loc=np.where(rethreshold) if len(loc[0] ) 0:#如果方法是TM_SQDIFF或TM_SQDIFF_NORMED,则采用[cv2.TM_SQDIFF_NORMED]:的最小if方法。 Bottom_right,100,20)plt.subplot(121),plt.imshow(res,cmap='灰色') plt.title('匹配结果'), plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(img,cmap='灰色') plt.title('检测点'), plt.xticks([]), plt.yticks([]) plt.suptitle( meth) plt.show() else: print('模板不匹配')
结论是
这里描述的最常见的图像处理技术可用于图像分析,包括图像分类、对象检测和OCR。
版权声明:本文转载于网络,版权归作者所有。如有侵权,请联系本站编辑删除。