前进之路 发表于 2024-11-2 23:54:18

opencv-day2-图像预处理1

图像预处理

在计算机视觉和图像处理领域,图像预处理可以或许进步后续处理(如特征提取、目的检测等)的准确性和效率。
常见的图像预处理操作:

[*] 图像色彩空间转换
[*] 图像大小调整
[*] 图像仿射变换
[*] 图像翻转
[*] 图像裁剪
[*] 图像二值化处理
[*] 图像去噪
[*] 边缘检测
[*] 图像平滑处理
[*] 图像形态学

图像翻转

cv2.flip 是 OpenCV 库中的一个函数,用于翻转图像。翻转可以是程度翻转、垂直翻转或同时程度和垂直翻转。这个函数担当两个参数:要翻转的图像和一个指定翻转范例的标志。
函数签名
cv2.flip(src, flipCode[, dst]) -> dst 参数分析


[*] src:输入图像,可以是恣意范例和深度的多通道图像。
[*] flipCode
:指定翻转范例的整数标志:

[*] 0:沿 X 轴翻转(垂直翻转)
[*] 1:沿 Y 轴翻转(程度翻转)
[*] -1:沿 X 轴和 Y 轴翻转(同时程度和垂直翻转)

[*] dst:可选参数,输出图像。如果未提供,输出图像将与输入图像具有雷同的尺寸和范例。
示例
以下是一些利用 cv2.flip 的示例代码:
import cv2

# 加载图像
image = cv2.imread("save_image/car.png")
# 翻转: -1:水平和垂直 1:水平翻转,0 垂直翻转
img = cv2.flip(image, -1)
# 显示原始图像和翻转后的图像
cv2.imshow('img', img)
# 等待按键并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows() import cv2
img=cv2.imread("image/car.png")
#翻转:0:垂直翻转;1:水平翻转;-1是水平垂直翻转
f_img=cv2.flip(img,-1)
cv2.imshow("old",img)
cv2.imshow("new",f_img)
cv2.waitKey(0)
cv2.destroyAllWindows() 图像仿射变换

仿射变换(Affine Transformation)是一种线性变换,它保持了点之间的相对间隔不变,即平行线在变换后仍然保持平行。在图像处理中,仿射变换常用于旋转、缩放、平移和剪切等操作。
图像旋转

旋转操作可以将图像绕着某个点旋转肯定的角度
实例代码
import cv2

# 加载图像
image = cv2.imread("images/car.png")
# 获取图像的尺寸
(h, w) = image.shape[:2]
# 设置旋转中心和旋转角度
center = (w // 2, h // 2)
# 计算旋转矩阵
# 旋转角度(可修改)
angle = 40
# 缩放比例 1.0 表示不缩放
M = cv2.getRotationMatrix2D(center, angle, 1.0)
# 进行旋转
rotated_image = cv2.warpAffine(image, M, (w, h))
cv2.imshow('Rotated Image', rotated_image)
# 等待按键并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows() cv2.getRotationMatrix2D 是 OpenCV 库中的一个函数,用于获取旋转矩阵。这个函数重要用于图像的旋变化换。旋转矩阵是一个 2x3 的矩阵,可以用来将图像围绕指定的中央点旋转指定的角度,并且可以选择是否进行缩放。
函数签名
cv2.getRotationMatrix2D(center, angle, scale) -> M 参数分析


[*] center:旋转中央点的坐标,格式为 (x, y)。
[*] angle:旋转角度,单元为度。正角度表现逆时针旋转,负角度表现顺时针旋转。
[*] scale:缩放比例。如果设置为 1,则不进行缩放。
返回值


[*] M:2x3 的旋转矩阵。
示例
以下是一个利用 cv2.getRotationMatrix2D 的示例代码,

cv2.warpAffine 函数
仿射变换 函数
cv2.warpAffine(src, M, dsize, dst) →

[*] src: 输入图像。
[*] M: 2x3 的变换矩阵,范例为 np.float32。
[*] dsize: 输出图像的尺寸,情势为 (width, height)。
[*] dst (可选): 输出图像。如果未提供,则会主动创建一个新的图像。
import cv2

img=cv2.imread("image/car.png")
#获取图片的像素
(h,w)=img.shape[:2]
#旋转的坐标
center=(100,120)
#旋转的角度
du=30
#获取图像矩阵
m=cv2.getRotationMatrix2D(center,du,1)#1:保留不变;>1放大;<1缩小
#图像旋转
w_img=cv2.warpAffine(img,m,(w,h))
cv2.imshow("image",w_img)
cv2.waitKey(0)
cv2.destroyAllWindows() 图像平移

平移操作可以将图像中的每个点沿着某个方向移动肯定的间隔

import cv2
import numpy as np

# 读取图像
img = cv2.imread("images/car5.png")
#获取图片像素
(h, w) = img.shape[:2]
# 定义平移矩阵
#tx 图片x轴移动200,ty是图片y轴移动50px
tx, ty = 200, 50
#获取平移矩阵
M = np.float32([, ])
# 应用平移变换
translated = cv2.warpAffine(img, M, (w, h))
# 显示结果
cv2.imshow('Translated Image', translated)
cv2.waitKey(0)
cv2.destroyAllWindows() 此中,tx 和 ty 分别表如今x轴和y轴方向上的平移间隔。
import cv2
import numpy as np

img=cv2.imread("image/car.png")
(h,w)=img.shape[:2]
#定义平移水平和垂直移动的距离
ty=50
tx=100
#创建一个平移的矩阵
#t_img=np.float32([,])
t_img=cv2.getRotationMatrix2D((tx,ty),-1,1)#?
w_img=cv2.warpAffine(img,t_img,(w,h))

cv2.imshow("m",w_img)
cv2.waitKey(0)
cv2.destroyAllWindows() 图像缩放

缩放操作可以改变图像的大小
import cv2
import numpy as np

# 读取图像
img = cv2.imread("images/car5.png")
h, w, channels = img.shape
# 定义缩放因子
sx, sy = 1.5, 1.5
M = np.float32([, ])
# 应用缩放变换
scaled = cv2.warpAffine(img, M, (int(w * sx), int(h* sy)))
# 显示结果
cv2.imshow('Scaled Image', scaled)
cv2.waitKey(0)
cv2.destroyAllWindows() sx 和 sy 分别表如今x轴和y轴方向上的缩放因子。
import cv2
import numpy as np

img=cv2.imread("image/car.png")
(h,w)=img.shape[:2]
#定义缩放的参数,缩放的参数大于1的是放大,小于1的是缩小
ww=1.5
hh=1.5
m=np.float32([,])
#仿射变换
t_img=cv2.warpAffine(img,m,(int(w*ww),int(h*hh)))

cv2.imshow("m",t_img)
cv2.waitKey(0)
cv2.destroyAllWindows() 图像剪切

剪切操作可以改变图像的形状,使其在某个方向上倾斜
import cv2
import numpy as np

# 读取图像
img = cv2.imread("images/car5.png")
rows, cols, _ = img.shape
# 定义剪切因子
shx, shy = 0.2, 0.2
M = np.float32([, ])
# 应用剪切变换
sheared = cv2.warpAffine(img, M, (cols, rows))

# 显示结果
cv2.imshow('Sheared Image', sheared)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np

img=cv2.imread("image/car.png")
(h,w)=img.shape[:2]
#定义图像剪切的参数
sx=0.1
sy=1
#定义矩形
m=np.float32([,])
#图像剪切
i_img=cv2.warpAffine(img,m,(w,h))
cv2.imshow("o",img)
cv2.imshow("a",i_img)
cv2.waitKey(0)
cv2.destroyAllWindows() 图像色彩空间转换

OpenCV中的色彩空间转换是将图像从一种颜色表现情势转换为另一种颜色表现情势的过程。常见的颜色空间包罗RGB、HSV、YUV等。
色彩空间转换有几个告急的作用:

[*] 方便图像处理:在差别的颜色空间中,对应的通道代表了差别的属性,比方在RGB空间中,红、绿、蓝三个通道分别代表了颜色的强度,而在HSV空间中,H(色相)代表了颜色的种类,S(饱和度)代表了颜色的深浅,V(亮度)代表了颜色的明暗。因此,对于差别的处理需求,选择差别的颜色空间进行处理可以更加方便。
[*] 进步图像处理效果:在某些环境下,利用某些特定的颜色空间可以进步图像处理的效果。比方,在HSV空间中,可以通过调整S(饱和度)和V(亮度)来进步图像的对比度并去除噪点。
[*] 节省计算资源:在某些环境下,利用特定的颜色空间可以帮助我们节省计算资源。比方,在RGB空间中,每个像素必要3个通道来表现,而在灰度空间中,每个像素只必要一个通道就可以表现。因此,如果我们只必要处理亮度信息而不必要颜色信息时,将图像转换为灰度空间可以节省计算资源。
总之,色彩空间转换在图像处理中是一项非常告急的技术,它可以方便我们对图像进行处理,并进步图像处理的效果和节省计算资源。
cv2.cvtColor()是OpenCV中的一个函数,用于图像颜色空间的转换。它可以将一个图像从一个颜色空间转换为另一个颜色空间,比如从RGB到灰度图像的转换,大概从BGR到HSV的转换等。
函数的语法如下:
cv2.cvtColor(src, code) 参数分析:


[*] src:输入图像,可以是一个NumPy数组大概一个OpenCV的Mat对象。
[*] code:指定转换的范例,可以利用预定义的转换代码,比方cv2.COLOR_BGR2GRAY表现从BGR到灰度图像的转换。

RGB 转 Gray(灰度)

RGB 转 Gray(灰度),将彩色图像转换为灰度图像,可以减少数据量并简化算法。
   image = cv2.imread("../images/car.png")
   # 将图像从BGR到灰度图像的转换
   gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

   # 显示原始图像和转换后的灰度图像
   cv2.imshow('old Image', image)
   cv2.imshow('new Image', gray_image)
   cv2.waitKey(0)
   cv2.destroyAllWindows() import cv2

img=cv2.imread("image/car.png")
#图像色彩空间转换
#opencv默认的图像格式BGR
#COLOR_BGR2GRAY 把BGR图像转换成灰度图像
gay_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(img)#矩阵信息
print('--------------')
print(gay_img)
cv2.imshow("old",img)
cv2.imshow("new",gay_img)
cv2.waitKey(0)
cv2.destroyAllWindows() RGB 转 HSV

RGB 转 HSV,HSV(Hue, Saturation, Value)色彩空间在颜色分割和颜色识别中非常有用。
import cv2
#在某些情况下,使用某些特定的颜色空间可以提高图像处理的效果。
# 例如,在HSV空间中,可以通过调整S(饱和度)和V(亮度)来提高图像的对比度并去除噪
image = cv2.imread("images/car.png")
# 将图像从BGR到灰度图像的转换
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
#转换后的图像
cv2.imshow('new Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows() import cv2

img=cv2.imread("image/car.png")
#图像色彩空间转换
#opencv默认的图像格式BGR
#COLOR_BGR2HSV 把BGR图像转换成HSV图像,提高亮度和饱和度
gay_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
print(img)#矩阵信息
print('--------------')
print(gay_img)
cv2.imshow("old",img)
cv2.imshow("new",gay_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像二值化处理

案例:
import cv2

# 读取图像并转换为灰度图
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 应用阈值
thresh_value = 127
retval, binary_image = cv2.threshold(image, thresh_value, 255, cv2.THRESH_BINARY)

# 显示结果
cv2.imshow('原图', image)
cv2.imshow('二值图像', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows() cv2.threshold 是 OpenCV 中用于图像二值化的函数。它通过设置阈值将图像分为前景和背景,常用于图像处理和分析。以下是该函数的重要功能和用法简介:
功能
cv2.threshold 将灰度图像转换为二值图像,根据指定的阈值将像素值分为两类:高于阈值的像素设为一个值(通常是255),低于阈值的像素设为另一个值(通常是0)。
语法
retval, dst = cv2.threshold(src, thresh, maxval, type)
​ 参数

[*] src: 输入的灰度图像。
[*] thresh: 阈值,决定分割的边界。
[*] maxval: 当像素值凌驾阈值时,赋予的最大值(通常为255)。
[*] type
: 阈值范例,常用的有:

[*] cv2.THRESH_BINARY: 凌驾阈值的像素设为最大值,别的设为0。
[*] cv2.THRESH_BINARY_INV: 凌驾阈值的像素设为0,别的设为最大值。
[*] cv2.THRESH_TRUNC: 凌驾阈值的像素设为阈值,别的不变。
[*] cv2.THRESH_TOZERO: 凌驾阈值的像素不变,别的设为0。
[*] cv2.THRESH_TOZERO_INV: 凌驾阈值的像素设为0,别的不变。

返回值


[*] retval: 现实利用的阈值(可能与输入值差别)。
[*] dst: 输出的二值图像。
import cv2
img=cv2.imread("image/car.png")
#把图像转换成灰度图像
g_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#二值化处理
#re实际应用阈值,t_img:转换后的图像
rs,t_img=cv2.threshold(g_img,100,255,cv2.THRESH_BINARY)
cv2.imshow("aa",img)
cv2.imshow("a",t_img)
cv2.waitKey(0)
cv2.destroyAllWindows() 图像掩膜

它通常用于创建掩膜,以便从图像中提取特定颜色的区域。
函数原型
cv2.inRange(src, lowerb, upperb)
​ 参数


[*] src: 输入的图像,可以是彩色图像(HSV图像,不是BGR图像)或灰度图像。
[*] lowerb: 颜色范围的下界(数组或元组),指定了要提取的颜色的最小值。
[*] upperb: 颜色范围的上界(数组或元组),指定了要提取的颜色的最大值。
返回值


[*] 返回一个二值图像,白色部分表如今指定颜色范围内的区域,黑色部分表现不在范围内的区域
案例
import cv2
import numpy as np

# 读取图像
image = cv2.imread("images/car.png")
# 将图像从 BGR 转换到 HSV 颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义颜色范围,(蓝色区域)
lower = np.array()
upper = np.array()
# 使用 inRange 函数创建掩模
mask = cv2.inRange(hsv_image, lower, upper)
cv2.imshow('01', mask)
cv2.waitKey(0)
cv2.destroyAllWindows() import cv2
import numpy as np

img=cv2.imread("image/car5.png")
#把图像转换成HSV空间
hsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#获取蓝色所在HSV范围,需要自己根据实际情况做调整
lower=np.array()
height=np.array()
#创建掩膜-针对特定的颜色
#hsv_img输入的图像是HSV图像
mask=cv2.inRange(hsv_img,lower,height)
cv2.imshow("b",img)
cv2.imshow("a",mask)
cv2.waitKey(0)
cv2.destroyAllWindows() 图像位与操作

cv2.bitwise_and() 是 OpenCV 库中的一个函数,用于对两个图像进行按位与操作。这个操作会逐个像素地对两个输入图像进行比较,只有在两个像素均为 255(白色)时,输出的像素才会为 255(白色),否则输出为 0(黑色)。这个函数在图像处理中的应用非常广泛,尤其是在掩膜和图像分割等任务中
函数原型
dst = cv2.bitwise_and(src1, src2, mask=None)
​ 参数分析


[*] src1: 第一个输入图像。
[*] src2: 第二个输入图像。两幅图像应具有雷同的尺寸和范例。
[*] mask: 可选参数,用于指定一个掩膜。如果提供,只有在掩膜的相应位置为非零时,才会计算输出。
返回值


[*] 返回按位与操作后的图像(dst)。
案例
import cv2
import numpy as np

# 读取图像
image = cv2.imread("images/car.png")
# 将图像从 BGR 转换到 HSV 颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义颜色范围,(蓝色区域)
lower = np.array()
upper = np.array()
# 使用 inRange 函数创建掩模
mask = cv2.inRange(hsv_image, lower, upper)
#位与操作
image = cv2.bitwise_and(image,image,mask=mask)
cv2.imshow('01', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像检测轮廓

cv2.findContours 函数可以在二值图像中找到轮廓,并返回轮廓的点集。轮廓可以用来表现物体的边界,常用于物体检测、分割和形状分析。
语法
contours, hierarchy = cv2.findContours(image, mode, method) 参数

[*] image: 输入的二值图像。通常在调用该函数之前必要将图像转换为灰度图像并进行二值化处理(如利用 cv2.threshold 或 cv2.Canny)。
[*] mode
: 轮廓检索模式:

[*] cv2.RETR_EXTERNAL: 只检索外部轮廓。
[*] cv2.RETR_LIST: 检索所有轮廓,并将其放入列表中。
[*] cv2.RETR_TREE: 检索所有轮廓,并创建层级关系。

[*] method
: 轮廓迫近方法:

[*] cv2.CHAIN_APPROX_SIMPLE: 压缩轮廓,仅保存端点。
[*] cv2.CHAIN_APPROX_NONE: 保存所有轮廓点。

返回值


[*] contours: 一个 Python 列表,此中每个元素是一个轮廓(即一组点),轮廓的点以 NumPy 数组的情势存储。
[*] hierarchy: 轮廓的层级信息,包含轮廓之间的关系。
案例:
import cv2

# 读取图像并转换为灰度图像
image = cv2.imread("images/car.png")
# 将图像从BGR到灰度图像的转换
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化处理
retval, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(binary_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 把灰度图像转换彩色图像
output_image = cv2.cvtColor(binary_image, cv2.COLOR_GRAY2BGR)
# 绘制轮廓
cv2.drawContours(output_image, contours, -1, (0, 255, 0), 2)
# 显示结果
cv2.imshow('Contours', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows() cv2.boundingRect 函数先容
cv2.boundingRect 是 OpenCV 中用于计算轮廓的最小外接矩形的函数。这个函数可以返回一个包含轮廓的最小矩形的边界框,通常用于对象检测、图像分割等任务中。最小外接矩形是一个完全包围轮廓的矩形,其边与图像的坐标轴平行。
案例
import cv2

# 读取图像并转换为灰度图像
image = cv2.imread("images/car.png")
# 将图像从BGR到灰度图像的转换
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化处理
retval, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(binary_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 把灰度图像转换彩色图像
output_image = cv2.cvtColor(binary_image, cv2.COLOR_GRAY2BGR)
# 绘制轮廓
cv2.drawContours(output_image, contours, -1, (0, 255, 0), 2)
# 在每个轮廓上绘制最小外接矩形
for contour in contours:
   #获取绘制轮廓的边界框
   x, y, w, h = cv2.boundingRect(contour)
   cv2.rectangle(output_image, (x, y), (x + w, y + h), (0, 100, 0), 2)
# 显示结果
cv2.imshow('Contours', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows() 练习:

完成对车牌的分割提取
1 基于车牌是蓝色,可以通过掩模找到车牌地点区域
import cv2
import numpy as np

# 读取图像
image = cv2.imread("../images/car.png")

# 将图像从 BGR 转换到 HSV 颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 定义颜色范围,(蓝色区域)
lower = np.array()
upper = np.array()
# 使用 inRange 函数创建掩模
mask = cv2.inRange(hsv_image, lower, upper)
cv2.imshow('Contours', mask)
cv2.waitKey(0)
cv2.destroyAllWindows() 效果图如下:
https://i-blog.csdnimg.cn/direct/4db30fd25cae4f65917d598fd0c3441c.png
2 掩模返回一个二值对象,可以通过图像轮廓检测,检测当前掩码图像的轮廓
# 查找轮廓
contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 在每个轮廓上绘制最小外接矩形
for contour in contours:
   #获取绘制轮廓的边界框
   x, y, w, h = cv2.boundingRect(contour)
   cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 显示结果
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows() 效果如下:

3 获取所有轮廓的边界框,我们发现车牌轮廓也在期间,通过调试,我们给一个车牌尺寸的范围值,提取车牌
   x, y, w, h = cv2.boundingRect(contour)
   if w > 50 and h > 20:  # 可根据实际车牌尺寸调整
     cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) 效果如下:
https://i-blog.csdnimg.cn/direct/6840f4badbe748ca8d227be03ba29e4d.png

4 末了,用图片切割切出车牌
 plate_image = image  # 切割车牌区域 https://i-blog.csdnimg.cn/direct/daab1262d7724cb384c68a109dddbb41.png
import cv2
import numpy as np
img=cv2.imread("image/car.png")
#把图像转换成HSV空间
hsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#获取蓝色所在HSV范围,需要自己根据实际情况做调整
lower=np.array()
height=np.array()
#创建掩模-针对特定的颜色
#hsv_img输入的图像是HSV图像
mask=cv2.inRange(hsv_img,lower,height)

# #把图像转化为灰度图像
# # gay_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#二值化处理
ret,t_img=cv2.threshold(mask,120,255,cv2.THRESH_BINARY)
#检测轮廓
myList,c=cv2.findContours(t_img,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
#把图像转换成BGR图像
bgr_img=cv2.cvtColor(t_img,cv2.COLOR_GRAY2BGR)
#画出检测的轮廓的点
out_img=cv2.drawContours(bgr_img,myList,-1,(0,255,0),1)

for c in myList:
   x,y,w,h=cv2.boundingRect(c)
   print(x,y,w,h)
   # 根据图片实际情况调整
   if w>100 and h>50:
#画出轮廓
      cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),1)
      #找w,h最大值
      cai_img=img


cv2.imshow("a",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
https://i-blog.csdnimg.cn/direct/b0bbe969b7d147e7828271b7587b67c0.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: opencv-day2-图像预处理1