Python-OpenCV教程丨图像的基本处理

发布时间:2024年01月17日

写在前面

本篇文章主要介绍图片的基本处理,包括但不限于:模板匹配、滤波器、腐蚀与膨胀、图形检测、人脸识别……

进阶篇

1.模板匹配

"""
作者:Want595
微信号:Want_595
公众号:Want595
"""
import cv2

image = cv2.imread("map.png")
tem = cv2.imread("tem.png")
height, width, c = tem.shape
results = cv2.matchTemplate(image, tem, cv2.TM_CCOEFF_NORMED)
station_Num = 0
for y in range(len(results)):
    for x in range(len(results)):
        if results[y][x] > 0.5:
            cv2.rectangle(image, (x, y), (x+width, y+height), (255, 0, 0), 2)
            station_Num += 1
cv2.putText(image, "the numbers of stations: " + str(station_Num), (0, 30), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 0, 255), 1)
cv2.imshow("result", image)
cv2.waitKey()
cv2.destroyAllWindows()

该代码是一个简单的图像匹配示例。首先,通过cv2.imread函数读取了一张地图图片和一个模板图片。然后,使用cv2.matchTemplate函数对地图图片进行模板匹配,得到结果矩阵。接着,使用两个循环遍历结果矩阵,找到匹配程度大于0.5的位置,并在地图图片上画出对应的矩形框。最后,在地图图片上添加了一个显示站点数量的文字。

这段代码适用于对一张地图图片中的特定模板进行匹配,并统计匹配到的数量。例如,可以将地图图片设置为一张包含多个站点的地铁线路图,将模板设置为地铁站点的图标,通过模板匹配找到并统计出地铁站点的数量。

需要注意的是,代码中的模板匹配方法使用的是TM_CCOEFF_NORMED,可以根据具体需求选择其他的匹配方法。

总结起来,这段代码实现了简单的图像匹配功能,并可以统计匹配到的数量,适用于一些简单的视觉识别和计算问题。

2.滤波器

Pikachu

"""
作者:Want595
微信号:Want_595
公众号:Want595
"""
import cv2

img = cv2.imread("bg.jpg")
img = cv2.resize(img, None, fx=1/4, fy=1/4)
dst1 = cv2.blur(img, (3, 3))
dst2 = cv2.blur(img, (5, 5))
dst3 = cv2.blur(img, (9, 9))
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.imshow("dst3", dst3)
cv2.waitKey()
cv2.destroyAllWindows()

该代码是一个简单的图像模糊示例。首先,通过cv2.imread函数读取了一张图片并赋值给变量img。然后,使用cv2.resize函数将图片的尺寸缩小为原来的1/4,以便更好地显示效果。

接下来,使用cv2.blur函数对缩小后的图片进行模糊处理。cv2.blur函数接受两个参数,第一个参数为输入图片,第二个参数为模糊核的大小。模糊核的大小越大,图片的模糊程度越高。在这段代码中,分别使用了(3, 3)、(5, 5)和(9, 9)作为模糊核的大小,得到了三张不同程度的模糊图片,并分别赋值给了dst1、dst2和dst3。

最后,使用cv2.imshow函数显示三张模糊图片,并通过cv2.waitKey和cv2.destroyAllWindows函数等待用户按下任意键以关闭窗口。

总结起来,这段代码实现了简单的图像模糊功能,并展示了不同模糊程度下的效果。可以通过调整模糊核的大小来控制模糊程度,适用于一些对图片进行模糊处理的场景。

3.腐蚀与膨胀

"""
作者:Want595
微信号:Want_595
公众号:Want595
"""
import cv2
import numpy as np
img = cv2.imread("bg.jpg")
img = cv2.resize(img, None, fx=1/4, fy=1/4)
k = np.ones((5, 5), np.uint8)
dst = cv2.erode(img, k)
dst = cv2.dilate(dst, k)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

该代码实现了图像腐蚀和膨胀操作。首先,通过cv2.imread函数读取了一张图片并赋值给变量img。然后,使用cv2.resize函数将图片的尺寸缩小为原来的1/4,以便更好地显示效果。

接着,创建了一个大小为(5, 5)的矩形结构元素k,矩形结构元素中的所有元素都被设置为1,即函数np.ones((5, 5), np.uint8)。

然后,使用cv2.erode函数对缩小后的图片进行腐蚀操作。cv2.erode函数接受两个参数,第一个参数为输入图片,第二个参数为结构元素k。腐蚀操作会将结构元素在图像上进行平移,并判断结构元素内的所有像素是否都为1,如果是,则将中心像素设置为1,否则设置为0。

接着,再使用cv2.dilate函数对上一步得到的腐蚀图片进行膨胀操作。cv2.dilate函数的参数和cv2.erode函数相同,膨胀操作与腐蚀操作相反,会将结构元素在图像上进行平移,并判断结构元素内的像素是否存在至少一个像素为1,如果是,则将中心像素设置为1,否则设置为0。

最后,使用cv2.imshow函数显示经过腐蚀和膨胀处理后的图片,并通过cv2.waitKey和cv2.destroyAllWindows函数等待用户按下任意键以关闭窗口。

总结起来,这段代码实现了图像腐蚀和膨胀操作,通过使用不同的结构元素和调整参数,可以实现对图像的细节处理和边缘增强的效果。

4.图形检测

"""
作者:Want595
微信号:Want_595
公众号:Want595
"""
import cv2
img = cv2.imread("bg.jpg")
img = cv2.resize(img, None, fx=1/4, fy=1/4)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
t, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
cv2.drawContours(img, contours, -1, (0,0,255), 1)
cv2.imshow("binary", binary)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

该段代码实现了图像的二值化以及轮廓检测功能。首先通过cv2.imread函数读取一张图片,并将其尺寸缩小为原来的1/4。

然后,使用cv2.cvtColor函数将图片从BGR颜色空间转换为灰度图像。将灰度图像赋值给变量gray。

接下来,使用cv2.threshold函数对灰度图像进行二值化处理。该函数接受五个参数,第一个参数是输入图像,第二个参数是阈值,第三个参数是最大像素值,第四个参数是阈值类型,第五个参数是用于存储二值化后的图像。

在这里,设置阈值为127,最大像素值为255,阈值类型为cv2.THRESH_BINARY,表示灰度值大于阈值的像素点设置为最大像素值,小于阈值的像素点设置为0。将二值化后的图像赋值给变量binary。

接着,使用cv2.findContours函数进行轮廓检测。该函数接受三个参数,第一个参数为二值化后的图像,第二个参数为轮廓检测模式,第三个参数为轮廓近似方法。

在这里,使用cv2.RETR_LIST表示检测所有的轮廓,cv2.CHAIN_APPROX_NONE表示不进行轮廓近似。将检测到的轮廓赋值给变量contours,并将轮廓的层次信息赋值给变量hierarchy。

最后,使用cv2.drawContours函数将检测到的轮廓绘制在原始图像上。该函数接受五个参数,第一个参数为绘制轮廓的图像,第二个参数为轮廓列表,第三个参数为绘制的轮廓索引(-1表示绘制所有轮廓),第四个参数为绘制颜色,第五个参数为绘制线条的粗细。

最后使用cv2.imshow函数显示二值化后的图像和绘制了轮廓的图像,通过cv2.waitKey和cv2.destroyAllWindows函数等待用户按下任意键以关闭窗口。

总结起来,这段代码实现了图像的二值化和轮廓检测功能,可以用于提取图像中的形状或对象的轮廓信息。

"""
作者:Want595
微信号:Want_595
公众号:Want595
"""
import cv2
img = cv2.imread("bg.jpg")
img = cv2.resize(img, None, fx=1/4, fy=1/4)
r1 = cv2.Canny(img, 400, 600)
cv2.imshow("img", img)
cv2.imshow("r1", r1)
cv2.waitKey()
cv2.destroyAllWindows()

该段代码实现了图像的边缘检测功能。首先通过cv2.imread函数读取一张图片,并将其尺寸缩小为原来的1/4。

然后,通过cv2.Canny函数对图像进行边缘检测。该函数接受三个参数,第一个参数是输入图像,第二个参数是低阈值,第三个参数是高阈值。

在这里,设置低阈值为400,高阈值为600。Canny算法是一种经典的边缘检测算法,它通过检测图像中的梯度变化来确定边缘。低阈值用于检测强边缘,高阈值用于连接弱边缘。

将边缘检测后的图像赋值给变量r1。

最后使用cv2.imshow函数显示原始图像和边缘检测后的图像,通过cv2.waitKey和cv2.destroyAllWindows函数等待用户按下任意键以关闭窗口。

总结起来,这段代码实现了图像的边缘检测功能,可以用于提取图像中的边缘信息。

5.视频处理

"""
作者:Want595
微信号:Want_595
公众号:Want595
"""
import cv2
capture = cv2.VideoCapture(0)
while(capture.isOpened()):
    retval, image = capture.read()

    cv2.imshow("video", image)
    key = cv2.waitKey(0)
    if key == 32:
        cv2.imshow("video", image)
        break
capture.release()
cv2.destroyAllWindows()

该段代码使用cv2.VideoCapture函数打开摄像头并捕获视频。

首先,使用cv2.VideoCapture函数创建一个VideoCapture对象,参数为0表示使用默认摄像头。然后,通过isOpened方法检查摄像头是否成功打开。

进入while循环,使用capture.read方法读取视频的一帧。返回值retval表示是否成功读取,image表示读取到的图像。

使用cv2.imshow函数显示读取到的图像,窗口标题为"video"。

使用cv2.waitKey(0)等待用户按键。

如果按下的是空格键(ASCII码为32),再次使用cv2.imshow函数显示读取到的图像,并通过break语句跳出循环。

在while循环结束后,调用capture.release()释放摄像头资源。

最后,调用cv2.destroyAllWindows()关闭所有窗口。

总结起来,该段代码实现了从摄像头捕获视频并实时显示的功能,可以用于实时视频监控等应用。

6.人脸识别

"""
作者:Want595
微信号:Want_595
公众号:Want595
"""
import cv2
img = cv2.imread("bg.jpg")
img = cv2.resize(img, None, fx=1/4, fy=1/4)
faceCascade = cv2.CascadeClassifier("cascades/haarcascade_frontalface_default.xml")
faces = faceCascade.detectMultiScale(img, 1.15)
for(x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

该段代码使用cv2.CascadeClassifier加载并使用Haar级联分类器进行人脸检测。

首先,使用cv2.imread函数读取一张图像,然后使用cv2.resize函数将其缩放为原大小的1/4。

接下来,使用cv2.CascadeClassifier函数加载Haar级联分类器,参数为"cascades/haarcascade_frontalface_default.xml",该xml文件是OpenCV提供的人脸检测分类器模型。

使用faceCascade.detectMultiScale方法对图像进行人脸检测,返回的faces是一个包含人脸位置和大小的矩形列表。

使用for循环遍历faces列表,对每个人脸绘制一个矩形框,并使用cv2.rectangle函数绘制矩形框,参数依次为图像、矩形框的左上角坐标、矩形框的右下角坐标、矩形框的颜色(蓝绿红通道的顺序,这里使用的是蓝色)和矩形框的线宽(2像素)。

最后,使用cv2.imshow函数显示带有人脸矩形框的图像。然后使用cv2.waitKey函数等待用户按下按键。

在用户按下按键后,调用cv2.destroyAllWindows函数关闭所有窗口。

总结起来,该段代码实现了使用Haar级联分类器检测人脸并在图像中绘制人脸矩形框的功能。可以用于人脸识别、人脸认证等应用。

写在后面

我是一只有趣的兔子,感谢你的喜欢!

文章来源:https://blog.csdn.net/m0_68111267/article/details/135635722
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。