Opencv学习(三)——图像变换

本文深入解析图像处理领域的关键算法,包括边缘检测、霍夫变换、重映射、仿射变换和直方图均衡化等技术。详细介绍Canny、Sobel、Laplacian和Scharr算子在边缘检测中的应用,霍夫变换在直线检测中的作用,以及仿射变换如何实现图像的平移、缩放和旋转。此外,还介绍了直方图均衡化提升图像对比度的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、边缘检测

边缘检测的一般步骤:

  1. 滤波——消除噪声
  2. 增强——使边界轮廓更加明显
  3. 检测——选出边缘点

1.1、canny算子

void Canny(

inputArray,

outputArray,

double threshold1,

double threshold2,

int apertureSize=3,

bool L2gradient=false

) ;

  • 第一个参数,输入图像,且需为单通道8位图像。
  • 第二个参数,输出的边缘图。
  • 第三个参数,第一个滞后性阈值。用于边缘连接。
  • 第四个参数,第二个滞后性阈值。用于控制强边缘的初始段,高低阈值比在2:1到3:1之间。
  • 第五个参数,表明应用sobel算子的孔径大小,默认值为3。
  • 第六个参数,bool类型L2gradient,一个计算图像梯度幅值的标识,默认值false。

1.2、sobel算子

void Sobel(

inputArray,

outputArray,

int ddepth,

int dx,

int dy,

int ksize=3,

double scale=1,

double delta=0,

int borderType=BORDER_DEFAULT

) ;

  • 第一个参数,输入图像。
  • 第二个参数,输出图像。
  • 第三个参数,输出图像深度。
  • 第四个参数,x方向上的差分阶数。
  • 第五个参数,y方向上的差分阶数。
  • 第六个参数,Sobel核的大小,默认值为3,必须为1、3、5、7。当为1时,往往使用3x1、1x3的内核,这种情况下,没有进行高斯平滑操作。
  • 第七个参数,计算导数值时可选的缩放因子,默认值1,表示默认情况下没用应用缩放。
  • 第八个参数,表示在结果存入输出图像之前可选的delta值,默认值0。
  • 第九个参数,边界模式。

1.3、Laplacian算子

void Laplacian(

inputArray,

outputArray,

int ddepth,

int ksize=1,

double scale=1,

double delta=0,

int borderType=BORDER_DEFAULT

) ;

  • 第一个参数,输入图像,且需为单通道8位图像。
  • 第二个参数,输出的边缘图。
  • 第三个参数,输出图像的图像深度。
  • 第四个参数,用于计算二阶导数的滤波器的孔径尺寸大小,大小必须为正奇数,默认值为1。
  • 第五个参数,计算拉普拉斯值的时候可选的比例因子,默认值为1。
  • 第六个参数,表示在结果存入目标图之前可选的delta值,默认值为0。
  • 第七个参数,边界模式。

1.4、scharr滤波器

void Scharr(

inputArray,

outputArray,

int ddepth,

int dx,

int dy,

double scale=1,

double delta=0,

int borderType=BORDER_DEFAULT

) ;

  • 第一个参数,输入图像。
  • 第二个参数,输出图像。
  • 第三个参数,输出图像深度。
  • 第四个参数,x方向上的差分阶数。
  • 第五个参数,y方向上的差分阶数。
  • 第六个参数,计算导数值时可选的缩放因子,默认值1,表示默认情况下没用应用缩放。
  • 第七个参数,表示在结果存入输出图像之前可选的delta值,默认值0。
  • 第八个参数,边界模式

二、霍夫变换

霍夫线变换是一种用来寻找直线的方法. 在使用霍夫线变换之前, 首先要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像。由HoughLines函数调用。

多尺度霍夫变换为经典霍夫变换在多尺度下的一个变种。由HoughLines函数调用。

累计概率霍夫变换算法是标准霍夫变换算法的一个改进,它在一定的范围内进行霍夫变换,计算单独线段的方向以及范围,从而减少计算量,缩短计算时间。由HoughLinesP函数调用。

void HoughLines(

InputArray image,

OutputArray lines,

double rho,

double theta,

int threshold,

double srn=0,

double stn=0

) ;

  • 第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像,可以将任意的源图载入进来后由函数修改成此格式后,再填在这里。
  • 第二个参数,InputArray类型的lines,经过调用HoughLines函数后储存了霍夫线变换检测到线条的输出矢量。每一条线由具有两个元素的矢量表示,其中,是离坐标原点((0,0)(也就是图像的左上角)的距离。 是弧度线条旋转角度(0垂直线,π/2水平线)。
  • 第三个参数,double类型的rho,以像素为单位的距离精度。另一种形容方式是直线搜索时的进步尺寸的单位半径。PS:Latex中/rho就表示 。
  • 第四个参数,double类型的theta,以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。
  • 第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中。
  • 第六个参数,double类型的srn,有默认值0。对于多尺度的霍夫变换,这是第三个参数进步尺寸rho的除数距离。粗略的累加器进步尺寸直接是第三个参数rho,而精确的累加器进步尺寸为rho/srn。
  • 第七个参数,double类型的stn,有默认值0,对于多尺度霍夫变换,srn表示第四个参数进步尺寸的单位角度theta的除数距离。且如果srn和stn同时为0,就表示使用经典的霍夫变换。否则,这两个参数应该都为正数。

void HoughLinesP(

InputArray image,

OutputArray lines,

double rho,

double theta,

int threshold,

double minLineLength=0,

double maxLineGap=0

) ;

  • 第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像,可以将任意的源图载入进来后由函数修改成此格式后,再填在这里。
  • 第二个参数,InputArray类型的lines,经过调用HoughLinesP函数后后存储了检测到的线条的输出矢量,每一条线由具有四个元素的矢量(x_1,y_1, x_2, y_2) 表示,其中,(x_1, y_1)和(x_2, y_2) 是是每个检测到的线段的结束点。
  • 第三个参数,double类型的rho,以像素为单位的距离精度。另一种形容方式是直线搜索时的进步尺寸的单位半径。
  • 第四个参数,double类型的theta,以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。
  • 第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中。
  • 第六个参数,double类型的minLineLength,有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。
  • 第七个参数,double类型的maxLineGap,有默认值0,允许将同一行点与点之间连接起来的最大的距离。

三、重映射

把一个图像中一个位置的像素放置到另一个图片指定位置的过程。

简单的说就是改变图片的位置(左,右,上,下,颠倒)

void remap(

InputArray src,

OutputArraydst,

InputArray map1,

InputArray map2,

int interpolation,

intborderMode=BORDER_CONSTANT,

const Scalar& borderValue=Scalar()

);

  • 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可,且需为单通道8位或者浮点型图像。
  • 第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放函数调用后的输出结果,需和源图片有一样的尺寸和类型。
  • 第三个参数,InputArray类型的map1,它有两种可能的表示对象
  • 第四个参数,InputArray类型的map2,同样,它也有两种可能的表示对象,根据map1来确定表示哪种对象。
  • 第五个参数,int类型的interpolation,插值方式,之前的resize( )函数中有讲到,需要注意,resize( )函数中提到的INTER_AREA插值方式在这里是不支持的,所以可选的插值方式如下:

INTER_NEAREST - 最近邻插值
INTER_LINEAR – 双线性插值(默认值)
INTER_CUBIC – 双三次样条插值(逾4×4像素邻域内的双三次插值)
INTER_LANCZOS4 -Lanczos插值(逾8×8像素邻域的Lanczos插值)

  • 第六个参数,int类型的borderMode,边界模式,有默认值BORDER_CONSTANT,表示目标图像中“离群点(outliers)”的像素值不会被此函数修改。
  • 第七个参数,const Scalar&类型的borderValue,当有常数边界时使用的值,其有默认值Scalar( ),即默认值为0

四、仿射变换

仿射变换(Affine Transformation)是空间直角坐标系的变换,从一个二维坐标变换到另一个二维坐标,仿射变换是一个线性变换,他保持了图像的“平行性”和“平直性”,即图像中原来的直线和平行线,变换后仍然保持原来的直线和平行线,仿射变换比较常用的特殊变换有平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)。

void warpAffine(

InputArray src,

OutputArray dst,

InputArray M,

Size dsize,

int flags=INTER_LINEAR,

intborderMode=BORDER_CONSTANT,

const Scalar& borderValue=Scalar()

) ;

  • 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。
  • 第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,需和源图片有一样的尺寸和类型。
  • 第三个参数,InputArray类型的M,2×3的变换矩阵。
  • 第四个参数,Size类型的dsize,表示输出图像的尺寸。
  • 第五个参数,int类型的flags,插值方法的标识符。此参数有默认值INTER_LINEAR(线性插值),可选的插值方式如下:

INTER_NEAREST - 最近邻插值
INTER_LINEAR - 线性插值(默认值)
INTER_AREA - 区域插值
INTER_CUBIC –三次样条插值
INTER_LANCZOS4 -Lanczos插值
CV_WARP_FILL_OUTLIERS - 填充所有输出图像的象素。如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.
CV_WARP_INVERSE_MAP –表示M为输出图像到输入图像的反变换,即 。因此可以直接用来做象素插值。否则, warpAffine函数从M矩阵得到反变换。

  • 第六个参数,int类型的borderMode,边界像素模式,默认值为BORDER_CONSTANT。
  • 第七个参数,const Scalar&类型的borderValue,在恒定的边界情况下取的值,默认值为Scalar(),即0。

五、直方图均衡化

直方图均衡化是通过调整图像的灰阶分布,使得在0~255灰阶上的分布更加均衡,提高了图像的对比度,达到改善图像主观视觉效果的目的。对比度较低的图像适合使用直方图均衡化方法来增强图像细节。

void equalizeHist(

InputArray src,

OutputArray dst

);

  • 第一个参数:Mat即可,需要8位单通道的图像
  • 第二个参数:需要与原图片相同尺寸
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值