opencv-python:图像处理

一、基础概念

1.几何变换

图像的几何变换是改变图像的几何属性,如位置、大小、形状和方向等的变换。
常见的几何变换包括平移、旋转、缩放、翻转和错切等。
平移是将图像在方向上移动一定的距离。
旋转是以图像的中心或指定的点为中心,将图像旋转一定的角度。
缩放是改变图像的大小,可以沿着水平方向和垂直方向进行不同比例的缩放。
翻转是将图像在水平方向或垂直方向上进行对称变换。
错切则是在一定方向上拉伸或压缩图像。
仿射变换可以看作是平移、旋转、缩放、翻转和错切的综合,仿射变换保持了二维图形的“平直性”和“平行性”,即直线在变换后仍然是直线,平行线在变换后仍然是平行线。
透视变换是三维空间上的非线性变换,可以看作是仿射变换的更一般形式,透视变换通过一个3x3的变换矩阵将原图投影到一个新的视平面

2.图像滤波

图像滤波

图像滤波是图像预处理操作,简单的讲,就是一幅图像通过滤波器得到另一幅图像。
图像滤波目的是在尽量保留图像细节特征的条件下,对目标图像的噪声进行抑制。
常见的图像滤波方法包括均值滤波、中值滤波和高斯滤波等。
均值滤波是一种简单的线性滤波方法,通过对图像中的像素进行平均操作,实现图像的平滑。
中值滤波是一种非线性滤波方法,通过对图像中的像素进行排序,选择中间值作为输出值,实现图像的去噪。
高斯滤波是一种基于高斯函数的线性滤波方法,通过对图像中的像素进行加权平均操作,实现图像的平滑。

滤波器(wave filter)

在图像处理中,滤波器,也叫卷积核 Convolutional Kernel是一种用于平滑图像、消除噪声或提取特定特征的工具。滤波的过程,称为卷积convolution。它通过在原始图像上滑动并卷积,利用相邻像素的值来确定每个像素的最终输出。
卷积核的大小一般为奇数,如3 * 3,5 * 5,7 * 7。
一是为了保证锚点anchor(卷积核的中心),刚好在正中间,方便以模块中心为标准进行滑动而不会发生偏移。
二是为了保证填充padding时,图像的两边依然对称。
一般情况下,卷积核越大,感受野越大,看到的图片信息越多,所获得的全局特征越好。但大的卷积核会导致计算量的暴增,计算性能也会降低。

输出图片尺寸计算公式

计算公式:N = (W - F + 2P) / S + 1
N(New)表示输出图像大小
W(Width)表示原图宽度
F(Filter)表示卷积核大小
P(Padding)表示扩充尺寸
S(Step)表示步长大小,默认为1

3.形态学处理(Morphological Processing)

  • 基于形状对图像进行处理的图像处理方法。
  • 利用一种特殊的结构元素(可以理解为卷积核)来测量或提取输入图像中相应的形状或特征
  • 针对二进制图像,因此需要对图片做二值化处理
  • 形态学处理包括腐蚀、膨胀、开运算(先腐蚀后膨胀)和闭运算(先膨胀后腐蚀)
    腐蚀操作:将一个对象的边界向内收缩,从而消除小物体或分离相连的物体。
    膨胀操作:将一个对象的边界向外扩张,从而填补物体内部的空洞或连接相邻的物体。
    开运算:可以用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。
    闭运算:可以用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。
    图像二值化:将图像中的每个元素均变为0或255

4.图像轮廓处理

图像轮廓是图像中不同颜色或亮度相邻区域之间的边界,也可以理解为将边缘连接起来形成的一个整体,本质上是具有相同颜色或强度的连续点的曲线。
查找图像轮廓前

  • 需要对图像进行二值化处理或Canny边缘检测
  • 需要对原图像进行深拷贝
  • 尽量将图片做成黑底白字更易于轮廓的查找

5.特征检测

特征图像或视频中有意义的信息,如边缘、角点、斑点、纹理等。
特征检测的应用:图像搜索、图像拼接等。
角点:灰度梯度最大值对应的像素、线条交点、极值点

二、opencv-python几何变换函数

1.图像缩放

resize(src, dst, dsize, fx, fy, interpolation)
fx, fy 分别是 x, y 轴的缩放因子

interpolation 插值算法
INTER_NEAREST 近邻算法,速度快,效果差
INTER_LINEAR 近邻算法,速度快,效果差
INTER_CUBIC 三次插值,原图中的16个点
INTER_AREA 效果最好
# 用dsize
import cv2 as cv
img = cv.imread("D://dev/opencv/sources/samples/data/starry_night.jpg")
img_resize = cv.resize(img, (400, 400))
cv.imshow("img", img)
cv.imshow("img_resize", img_resize)
cv.waitKey(0)
# 用缩放因子fx,fy
import cv2 as cv
img = cv.imread("D://dev/opencv/sources/samples/data/starry_night.jpg")
img_resize = cv.resize(img, None, fx=0.3, fy=0.3)
cv.imshow("img", img)
cv.imshow("img_resize", img_resize)
cv.waitKey(0)

2.图像翻转

flip(img, flipCode)

flipCode 翻转方向
flipCode == 0 上下翻转
flipCode > 0 左右翻转
flipCode < 0 上下左右翻转
import cv2 as cv
img = cv.imread("D://dev/opencv/sources/samples/data/starry_night.jpg")
img_flip = cv.flip(img, 0)
cv.imshow("img", img)
cv.imshow("img_flip", img_flip)
cv.waitKey(0)

3.图像旋转

rotate(img, rotateCode)

rotateCode 旋转角度
ROTATE_90_CLOCKWISE 逆向旋转90°
ROTATE_180 旋转180°
ROTATE_90_COUNTERCLOCKWISE 正向旋转90°
import cv2 as cv
img = cv.imread("D://dev/opencv/sources/samples/data/starry_night.jpg")
img_rotate = cv.rotate(starry_night, cv.ROTATE_90_CLOCKWISE)
cv.imshow("img", img)
cv.imshow("img_rotate", img_rotate)
cv.waitKey(0)

4.仿射变换

warpAffine(src, M, dsize, flags, borderMode, borderValue)
M:变换矩阵
flags:插值算法
后两个参数是原图移到边界之外的部分怎么处理

borderMode 边界模式
cv.BORDER_CONSTANT(default) 常值模式
cv.BORDER_REPLICATE 复制近邻元素
cv.BORDER_REFLECT 镜像填充

borderValue(在常值模式时, (0, 0, 0)默认值)

import cv2 as cv
import numpy as np 
img = cv.imread("D://dev/opencv/sources/samples/data/starry_night.jpg")
M = np.array([[1, 0, 100], [0, 1, 50]], dtype=np.float32)
h, w, ch = img.shape
img_Affine = cv.warpAffine(img, M, [w, h])
cv.imshow("img", img)
cv.imshow("img_Affine", img_Affine)
cv.waitKey(0)

5.获取旋转变换矩阵

getRotationMatrix2D(center, angle, scale)
center:旋转的中心点。
angle:旋转的角度,以度为单位。
scale:可选参数,缩放因子。如果提供了这个参数,那么在旋转的同时还会进行缩放。

import cv2 as cv
img = cv.imread("D://dev/opencv/sources/samples/data/starry_night.jpg")
M = cv.getRotationMatrix2D([100, 100], 45, 0.5)
h, w, ch = img.shape
img_Affine = cv.warpAffine(img, M, [w, h])
cv.imshow("img", img)
cv.imshow("img_Affine", img_Affine)
cv.waitKey(0)

retval, mat = cv.getAffineTransform(src, dst)
src:源图像中三角形顶点的坐标,这是一个点的数组。
dst:目标图像中相应三角形顶点的坐标,这也是一个点的数组。

import cv2 as cv
import numpy as np 
src = np.array([[100, 100], [100, 200], [200, 200]], dtype=np.float32)
dst = np.array([[200, 200], [200, 300], [300, 300]], dtype=np
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿卡不吃秋葵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值