opencv图像处理常见操作

1、读取和显示图像

使用opencv之前需要安装OpenCv

pip install opencv-python

图像的读取

import cv2

# 读取图像
image = cv2.imread('image.jpg')
# 图像的保存, 第一个是路径, 后面的是要保存的图像
cv2.imwrite("d:\img", image)
# 改变显示窗口的大小
"""
windowName: 这是要调整大小的窗口的名称,通常是通过 cv2.namedWindow() 函数创建的窗口的名称。
width: 这是要设置的窗口的新宽度,以像素为单位。
height: 这是要设置的窗口的新高度,以像素为单位。
"""
cv.resizeWindow(windowName, width, height)
# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2、图像的缩放和裁剪

[y1:y2, x1:x2] 代表了左上角和右下角的坐标

# 缩放图像
resized_image = cv2.resize(image, (width, height))

# 裁剪图像
cropped_image = image[y1:y2, x1:x2]

3、图像的平移、旋转、透视

见代码


# 平移
img = cv2.imread("hu.png")  # 读取图像
h, w, _ = img.shape  # 获取图像的高度和宽度
# 创建平移矩阵 M,其中 (50, 100) 是 X 和 Y 轴上的平移量
M = np.float32([[1, 0, 50], [0, 1, 100]])
img = cv2.warpAffine(img, M, (w, h))  # 应用平移变换
cv2.imshow("12", img)  # 显示结果图像
cv2.waitKey()  # 等待用户按下任意键后关闭窗口

# 旋转
img = cv2.imread("hu.png")  # 读取图像
h, w, _ = img.shape  # 获取图像的高度和宽度
center = (h // 2, w // 2)  # 计算图像中心坐标
# 创建旋转矩阵 M,其中 (center, 30, 0.8) 表示旋转角度为30度,缩放比例为0.8
M = cv2.getRotationMatrix2D(center, 30, 0.8)
img = cv2.warpAffine(img, M, (w, h))  # 应用旋转变换
cv2.imshow("", img)  # 显示结果图像
cv2.waitKey()  # 等待用户按下任意键后关闭窗口

# 透视
img = cv2.imread("../day01/2333333.jpg")  # 读取图像
h, w, _ = img.shape  # 获取图像的高度和宽度
# 定义原图的四个点坐标 p1 和透视后的四个点坐标 p2
p1 = np.zeros((4, 2), np.float32)
p1[0] = [0, 0]
p1[1] = [w, 0]
p1[2] = [0, h]
p1[3] = [w, h]
p2 = np.zeros((4, 2), np.float32)
p2[0] = [600, 0]
p2[1] = [w - 600, 0]
p2[2] = [400, h]
p2[3] = [w - 400, h]

# 获取透视变换矩阵 M
M = cv2.getPerspectiveTransform(p1, p2)
img = cv2.warpPerspective(img, M, (w, h))  # 应用透视变换
cv2.imshow("", img)  # 显示结果图像
cv2.resize(img, (600, 400))  # 调整图像大小(但未保存结果)
cv2.waitKey()  # 等待用户按下任意键后关闭窗口

4、图像滤波和边缘检测

(kernel_size, kernel_size) 是滤波核的大小,也称为卷积核或窗口大小。均值滤波核是一个正方形的矩阵,其大小由(kernel_size, kernel_size)指定,通常是一个奇数值,例如3x3、5x5等。滤波核的大小决定了滤波的程度,更大的核会导致更强烈的模糊效果。


# 高斯滤波
blurred_image = cv2.GaussianBlur(image, (kernel_size, kernel_size), 0)
# 均值滤波
blurred_image = cv2.blur(image, (kernel_size, kernel_size))

OpenCV 提供了多种边缘检测算法,其中最常用的是Canny边缘检测算法

import cv2

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)  # 以灰度模式读取图像

# 使用Canny边缘检测
# threshold1和threshold2是Canny算法的阈值,用于控制边缘检测的灵敏度。根据应用需求,你可以调整这两个阈值来获取适当的边缘检测结果。
edges = cv2.Canny(image, threshold1, threshold2)

# 显示原始图像和边缘图像
cv2.imshow('Original Image', image)
cv2.imshow('Edge Detection', edges)

# 等待用户按下任意键后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

5、腐蚀和膨胀

腐蚀 : 腐蚀操作可以缩小物体的边界,去除小的噪声点,以及分离连接的物体

import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)  # 以灰度模��读取图像

# 定义腐蚀核(结构元素)
kernel = np.ones((5, 5), np.uint8)

# 腐蚀操作
eroded_image = cv2.erode(image, kernel, iterations=1)

# 显示原始图像和腐蚀后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Eroded Image', eroded_image)

# 等待用户按下任意键后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

膨胀 :膨胀操作可以增加物体的边界,填充小的空洞,以及连接接近的物体

import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)  # 以灰度模式读取图像

# 定义膨胀核(结构元素)
kernel = np.ones((5, 5), np.uint8)

# 膨胀操作
dilated_image = cv2.dilate(image, kernel, iterations=1)

# 显示原始图像和膨胀后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Dilated Image', dilated_image)

# 等待用户按下任意键后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

6、图像转换

HSV颜色空间 是一种用于表示图像中颜色的方式。HSV颜色空间是一种常用的颜色表示方式,它包括以下三个分量:
色相(H): 表示颜色的种类,通常以角度度量。0度对应红色,120度对应绿色,240度对应蓝色,等等。
饱和度(S): 表示颜色的饱和度或纯度。饱和度为0表示灰度图像,饱和度为1表示完全饱和的颜色。
亮度(V): 表示颜色的亮度。0表示黑色,1表示白色。

# 灰度化
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 转HSV颜色空间
img = cv2.imread("234.jpg")
# 把图片冲BGR空间装换为HSV空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 设定要过滤的颜色范围的下界和上界阈值 (这里设定为紫色范围)
#上下限
low_hsv = np.array([125, 43, 46])
hign_hsv = np.array([155, 255, 255])
# 根据设定的颜色阈值,创建掩膜(将符合条件的像素设为白色,不符合条件的设为黑色)
mask1 = cv2.inRange(hsv, lowerb=low_hsv, upperb=hign_hsv)
cv2.imshow("",mask1)
# 将原始图片与提取出的颜色部分进行按位与操作,得到提取出的颜色部分
color = cv2.bitwise_and(img, img, mask=mask1)
# cv2.imshow("", color)
cv2.waitKey()

7、视频读取

cv2.VideoCapture 可以捕获摄像头,视频文件的话,直接指定好路径就行

import cv2
 
 # 读取视频
video = cv2.VideoCapture("./demo.mp4")
 

# 检查打开是否正确
if video.isOpened():
    # video.read() 一帧一帧地读取,即一张图像一张图像的读取
    # frame 得到当前这一帧的图像
    open, frame = video.read()
else:
    open = False
# 当视频进行读取时
while open:
    ret, frame = video.read()
    # 如果读到的帧数不为空,那么就继续读取,如果为空,就退出
    if frame is None:
        break
    if ret == True:
        # 转换为灰度图,这里COLOR_BGR2GRAY表示转为灰度图,想要其他的就用其他的就行
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        cv2.imshow("video",gray)
        # 这里使用 waitKey 可以控制视频的播放速度,数值越小,播放速度越快
        # 这里等于 27 也即是说按下 ESC 键即可退出该窗口
        if cv2.waitKey(10) & 0xFF == 27:
            break
video.release()
cv2.destroyAllWindows()

8、目标检测:人脸检测

以下代码使用Haar级联分类器来检测人脸,并做了贴图操作

import cv2

# 读取视频
cap = cv2.VideoCapture("18f.mp4")

# 读取图片
img = cv2.imread("fensi.png", 1)

# 获得视频帧的宽度和高度
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 创建VideoWriter以保存输出视频
out = cv2.VideoWriter("1.avi", cv2.VideoWriter_fourcc("M", "J", "P", "G"), cap.get(cv2.CAP_PROP_FPS), (w, h))

# 初始化人脸级联分类器
classifier = cv2.CascadeClassifier()

# 加载预训练的人脸级联分类器
classifier.load(r"haarcascade_frontalface_default.xml")

# 遍历视频的每一帧
while cap.isOpened():
    # 读取当前帧
    r, frame = cap.read()
    if not r:
        # 如果没有读取到帧(视频结束),跳出循环
        break

    # 将帧转换为灰度图
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 在帧中检测人脸
    faces = classifier.detectMultiScale(gray)

    for x, y, w, h in faces:
        # 在人脸周围绘制红色矩形框
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)

        # 将帧和logo调整到与检测到的人脸矩形相同的尺寸
        frame_h, frame_w, _ = frame.shape
        re_frame_h, re_frame_w, _ = img.shape
        new_h = int(h * frame_h / re_frame_h)
        new_w = int(w * frame_w / re_frame_w)
        logo = cv2.resize(img, (new_w, new_h))

        try:
            # 在人脸区域上覆盖logo
            frame[y - new_h:y, x + 10:x + 10 + new_w] = logo
        except:
            pass
        continue

    # 显示带有人脸检测结果的帧
    cv2.imshow("", frame)

    # 将帧写入输出视频
    out.write(frame)

    # 如果按下空格键,跳出循环
    if cv2.waitKey(20) & 0XFF == ord(" "):
        break

# 释放视频捕获和视频写入对象,关闭窗口
out.release()
cap.release()
cv2.destroyAllWindows()

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值