opencv图像处理
文章平均质量分 67
机器视觉领域的入门知识储备
德林恩宝
计算机科学与技术专业研究生,研究方向为计算机视觉[https://github.com/Lenubolim]
展开
-
数字图像处理---空间滤波基础
空间滤波器对图像处理的原理原创 2023-01-18 17:36:38 · 1695 阅读 · 0 评论 -
Opencv之谱残差显著性检测
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.前言在使用谱残差进行显著性检测之前,我们需要理解两个概念,分别是幅度谱和相位谱。幅度谱和相位谱是将图片进行傅里叶正向变换之后得到的结果。幅度谱表示的是每个正弦波的最大幅度值,相位谱表示的是每个正弦波的相位(当然需要选定一个基点)。原理图像的傅里叶变换是由幅度谱和相位谱表示的,即通过幅度谱和相位谱可以还原图像。而显著性检测就是通过调整幅度谱和相位谱显示显著目标。操作步骤计原创 2022-05-15 20:47:35 · 1478 阅读 · 1 评论 -
Opencv之基于梯度的霍夫圆的检测
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.前言标准霍夫圆的检测比较简单,与霍夫直线检测类似,此处不再提及。原理如下图所示:其中蓝色部分就是该点的梯度,也就是点在圆上的切线。做切线的垂直方向直线,得到如下所示:其中紫色的点,即为法线的交点。现在,我们只知道部分点和该点的梯度方向,如下图所示:现在的任务就是找到哪些点是位于同一个圆上。按照上述的方法,我们做出每个点的梯度方向的法线,可得到如下所示:根据上图可原创 2022-05-12 16:47:44 · 790 阅读 · 0 评论 -
Opencv之霍夫直线检测
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.原理直线在计算机图形中一般表示与我们在数学教材中有所不同,此处的y轴方向是向下的。那么象限的位置是顺时针计数的。上图中标注了四个参数,分别是直线与x轴正向的夹角φ\varphiφ,直线到原点的距离ϱ\varrhoϱ,ϱ\varrhoϱ所在直线与x轴的夹角ϑ\varthetaϑ,直线的截距bbb.类似的第二象限的直线为下图所示,三四象限类似,此处不列举。直线的数学表达原创 2022-05-12 14:34:32 · 2588 阅读 · 3 评论 -
Opencv之高斯拉普拉斯边缘检测
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.前言我们知道在进行拉普拉斯边缘检测时,并没有对图像进行平滑处理,就会对噪声产生明显的响应(可以进行对比实验查看效果)。那么,我们在使用拉普拉斯进行边缘检测时,首先要对图像进行高斯平滑处理,然后再进行拉普拉斯与图像的卷积操作。那么这就需要进行两次卷积运算。而为了将卷积次数控制在一次,聪明的人们发现可以借助二维高斯函数(如下图所示)进行拉普拉斯变换。(真的很佩服这些数学家们!)我从op原创 2022-05-11 21:23:38 · 1123 阅读 · 0 评论 -
Opencv之拉普拉斯Laplace算子及其边缘检测
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.前言简述一下什么是Laplace运算。拉普拉斯从定义上讲是梯度的散度。符号表示为△f=▽.▽f\triangle{f} =\bigtriangledown.\bigtriangledown{f}△f=▽.▽f(其中▽\bigtriangledown▽是梯度符号,▽.\bigtriangledown.▽.是散度的符号)对于函数f(x,y,z)f(x,y,z)f(x,y,z),它的梯度原创 2022-05-11 19:32:51 · 1455 阅读 · 0 评论 -
Opencv之Canny边缘检测(Python实现)
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.原理优点基于边缘梯度方向的非极大值抑制。双阈值的滞后阈值处理检测步骤首先将图像矩阵与水平方向的卷积核和垂直方向上的卷积核卷积得到dxdxdx和dydydy,然后利用平方和的开方dx+dy2\sqrt[2]{dx + dy}2dx+dy得到边缘强度。利用第一步计算出的dx和dydx和dydx和dy,计算出梯度方向angle=arctan2(dy,dx)angle=arc原创 2022-05-11 16:40:14 · 745 阅读 · 0 评论 -
Opencv之边缘检测卷积算子(sobel、scharr、Kirsch、Robinson)
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.原创 2022-05-09 10:52:10 · 1157 阅读 · 0 评论 -
Opencv之边缘检测卷积算子(roberts与prewitt)
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.Roberts算子原理使用Roberts进行边缘检测,也就是使用以下两个卷积核与图像进行分别卷积。(图中阴影部分数值为锚点所在)注意在实际讨论中一般将相近两点的函数值差值作为斜率。如那么上述的两个卷积核也就好理解了。类似于f(x,y) - f(x + 1,y + 1)与f(x,y) - f(x - 1,y + 1)两个函数差值。在边缘我们知道,边缘处的像素差值较大,斜率较原创 2022-05-08 21:55:30 · 2257 阅读 · 0 评论 -
Opencv之形态学操作(腐蚀、膨胀、开闭运算、顶帽、底帽)
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.腐蚀与膨胀腐蚀通俗讲就是对于一张图像,设定一个核如3*3,然后进行类似卷积操作,将该核与原图进行一一匹配操作,每次保留该区域的最小值作为锚点的值。如此操作就可以去掉高亮的部分。将图像中较亮的物体尺寸变小,较暗的尺寸变大。程序实现# 库函数# 参数分别为输入矩阵、结构元、结构元的锚点、腐蚀操作次数、边界扩充类型、边界扩充值# 返回类型为处理后的图像erode(src, elem原创 2022-05-08 19:18:31 · 270 阅读 · 0 评论 -
Opencv之自适应阈值(Python)
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.前言在使用各种阈值处理时,如果在不均匀照明或者灰度值分布不均的情况下,使用全局阈值分割往往达不到我们希望的效果,因此为每一个像素的位置设置一个对应的阈值是可能行的解决方案。原理详解在对图像进行如均值平滑、高斯平滑、中值平滑之后,得到的以当前像素为中心的领域内的灰度“平均值”,所以该平均值就可当作阈值的参考值。实现步骤假设输入图像为III,高为HHH、宽为WWW,平滑算子的尺原创 2022-05-08 17:10:36 · 1786 阅读 · 0 评论 -
Opencv之Otsu阈值处理(Python)
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.前言在对图像进行阈值分割之时,所选取的分割阈值应使前景区域的平均灰度、背景区域的平均灰度与整幅图像的平均灰度之间的差异最大,这种差异用区域的方差来表示。原理详解假设输入图像为III,高为HHH、宽为WWW,histogramIhistogram_IhistogramI代表归一化的图像的灰度直方图,histogramI(k)histogram_I(k)histogramI(k)原创 2022-05-08 15:22:04 · 4027 阅读 · 0 评论 -
Opencv之熵算法(Python)
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.前言熵算法中的熵,经过资料学习,即信息熵,这是一种量化信息的说法。即把信息中拍出来冗余后的平均信息量称为“信息熵”。感觉不太好懂,先看公式(如下图)其中P(xi)P(x_i)P(xi)代表随机事件X为xix_ixi的概率。通俗来讲,信息用信息量来衡量,信息量跟具体发生的事件的概率有关。并且从公式可以看出概率越大,时间的信息熵越小。如果要深层次理解,请查其他资料。原理将图像I原创 2022-05-07 21:24:18 · 2372 阅读 · 0 评论 -
Opencv之直方图技术法(Python)
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.前言直方图,熟悉的概念,可以用来表示每个数出现的概率,即频次。那么运用在图像处理中,简单的来说,如灰度图,就是表示灰度图中每个像素值的个数。原理详解而表示像素的用处在于对一些背景与前景在图中黑白上右明显的对比界限。如下图所示:上图中前景中的牛的灰度值大一些,而草地的灰度值小一些,两者的灰度值存在明显的差异。上图右侧的直方图则展示了该图片灰度值的统计图,这些灰度值的在中间明显有原创 2022-05-07 19:59:28 · 1539 阅读 · 0 评论 -
二维离散卷积之可分离卷积核
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.概念类比于线性代数中的两个矩阵的乘法运算。如果一个卷积核至少由两个尺寸比它小的卷积核full卷积而成,如下所示:那么这样的卷积核就可以分离。上述例子是分离为一维水平方向和一维垂直方向上的卷积核。当分离的一般不满足交换律。性质full卷积若卷积核可分离,那么我们进行卷积的时候,可以按照分离后,再进行卷积,如下所示:一般的卷积计算如下:I=(1231012324312原创 2022-04-09 20:53:18 · 3305 阅读 · 0 评论 -
图像平滑之二维离散卷积
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.基础概念二维离散卷积是在两个矩阵的基础上的一种计算方式,如下所示:I=(1234)I=\begin{pmatrix} 1 & 2 \\ 3 & 4 \\ \end{pmatrix}I=(1324),K=(−1−221)K=\begin{pmatrix} -1 & -2 \\ 2 & 1 \\ \end{pmatrix}K=(−12−21).计原创 2022-04-09 17:05:45 · 5258 阅读 · 0 评论 -
灰度直方图与线性变换
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.灰度直方图简而言之,就是一幅图的每个像素的取值次数的统计图。利用矩阵表示就是一个行矩阵。可采用库函数calcHist()进行统计实现。线性变换线性变换的基本模式为O(r,c)=a∗I(r,c)+b,0<=r<rows,0<=c<colsO(r,c) = a * I(r,c) + b,0 <= r < rows,0 <= c <原创 2022-04-09 11:25:13 · 4344 阅读 · 0 评论 -
Opencv之极坐标对图像进行变换
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.浅析原理与使用二维函数进行表示输入图像的像素一致,此处采用利用极坐标与笛卡尔坐标的一一对应关系得到图像输出矩阵的每一个像素值。实现...原创 2022-04-08 20:40:32 · 3082 阅读 · 5 评论 -
Opencv之投影变换
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.原理平面的物体若在三维空间发生了旋转,那么这就是投影变换。平面的物体可以借助二维投影变换进行三维变换模型化得到修正。处理函数c++中的getPerspectiveTransform(src,dst)函数需要四组对应的坐标变换,返回值类型为CV_64F。//原坐标Point2f src[]={Point2f(0,0),Point2f(200.0,0),Point2f(0,200原创 2022-04-08 15:15:22 · 2240 阅读 · 0 评论 -
Opencv之插值算法
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.前言将矩阵视为二维函数。即数学表达式为z = fI(x,y)=I(x,y),0<=x<W,0<=y<H,x∈N,Y∈Nf_I(x,y) = I(x,y),0 <= x < W,0 <= y < H,x\in N,Y \in NfI(x,y)=I(x,y),0<=x<W,0<=y<H,x∈N,Y∈N(NNN为正原创 2022-04-08 11:37:23 · 628 阅读 · 0 评论 -
仿射矩阵的计算
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.方程法由仿射矩阵可知,该矩阵中有6个未知数,所以一共需要六个方程来解6个未知数.(点击访问仿射矩阵)那么也就是需要三个坐标转换前与转换后的相应坐标值才能构造出仿射矩阵。库函数提供了如何求解的办法,我们只需提供三个坐标点(前后共6个)即可。示例#include<opencv2/core/core.hpp>#include<opencv2/highgui/high原创 2022-04-08 09:42:55 · 1647 阅读 · 0 评论 -
图像的几何变换
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.主要涉及三种几何变换,分别是仿射变换、投影变换和极坐标变换。仿射变换二维空间坐标的仿射变换公式如下:[xˉyˉ]\begin{bmatrix} \bar{x} \\ \bar{y} \end{bmatrix}[xˉyˉ] = [a11a12a21a22]\begin{bmatrix} a11 & a12 \\ a21 & a22 \\ \end{bmatrix}原创 2022-04-07 21:58:49 · 478 阅读 · 0 评论 -
图像数字化(C++)
原图(取自百度图片–点击访问)灰度图像数字化#include<opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>#include "opencv2/imgcodecs/legacy/constants_c.h"using namespace cv;#include<iostream>using namespace std;int main() { Mat img = imread("p原创 2022-04-07 19:50:09 · 1123 阅读 · 0 评论 -
Opencv中的Rect类
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.在前文中,我们知道使用rowRange与colRange可以进行截取部分矩阵。但OpenCV中有更加简便的方式,即Rect类。Rect(int x,int y,int width,int hight);//或者Size size(int width,int hight);Rect(int x,int y,Size size);//或者Rect(Point2i pt1,Po原创 2022-04-07 16:45:07 · 1286 阅读 · 0 评论 -
OpenCV中的Mat类(二)
学习资料参考:张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.分离通道OpenCV提供的split()函数可分离多通道,如将多通道矩阵mm分离为多个单通道,这些单通道被存放在vector容器中。Mat mm = (Mat_<Vec3i>(2,3) <<Vec3i(1,11,21),Vec3i(2,12,22),Vec3i(3,13,23),Vec3i(4,14,24)); vector<Mat> plane原创 2022-04-07 16:31:49 · 1339 阅读 · 0 评论 -
OpenCV中的Mat类(一)
概念Mat类就是指矩阵或者数组,该类在头文件opencv2\core\core.cpp中。创建与初始化Mat的构造函数为Mat(int row,int cols,int type)//或者Mat(Size(int cols,int rows),int type)// Size是一个类,第一个参数为列,第二个参数为行row表示行数,cols表示矩阵的列数,type表示类型(涉及通道类型与数据类型)通道类型有单通道(即二维矩阵,可表示为CV_8UC(1),C(1)表示单通道),多通道(原创 2022-04-07 15:25:24 · 2447 阅读 · 0 评论 -
灰度图、RGB图的区别
一、灰度图灰度图就是单通道图像,而单通道图是指维度数为2的图像。而灰度就是没有色彩,RGB色彩分量全部相等(可将这点与下文的RGB图进行对比)。那么灰度图的每个像素点就只有一个值表示颜色,像素值的范围就是[0~255]。如使用RGB表示灰度为100的图像,即RGB(100,100,100).简而言之,灰度图就是黑白图。(图片来源于:百度图片-点击访问)二、RGB图图像通道在RGB色彩模式下就是指在下就是指那单独的红色R、绿色G、蓝色B部分。与灰度图不同之处在于,该图的每个像素点都有3个值表原创 2022-04-05 21:03:39 · 7737 阅读 · 0 评论