由于这段时间做的项目主要是使用opencv来进行图像处理,所以记录一下用过的一些函数
函数接口
创建图像金字塔的两个函数pyrDown()和pryUp()。
图像金字塔是一种经典的图像多尺寸描述方法,它将降采样和平滑滤波结合在一起,对图像进行多尺度表示。图像金字塔由不同尺寸的图像叠加而成,通常每一层的尺寸都是上一层的一半。通常用于高效的图像分析,这种处理技术的意义在于:我们在对图像进行处理时,大多是要着眼于图像中有意义的部分,而同一幅图像中可能含有不同尺度下“有意义”的信息,为了充分利用这些图像信息,就需要对图像进行多尺度描述了。
pyrDown()
函数原型:
void pyrDown(InputArray src, OutputArray dst, const Size& dstsize=Size());
函数作用:
先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半);
函数说明:
需要说明一下的是第三个参数
const Size& dstsize=Size()
这个参数指的是降采样之后的目标图像的大小,我们可以看出它是有默认值的,如果我们调用函数的时候不指定第三个参数,那么这个值是按照 Size((src.cols+1)/2, (src.rows+1)/2) 计算的。而且不管你自己如何指定这个参数,一定必须保证满足以下关系式:
|dstsize.width * 2 - src.cols| ≤ 2;
|dstsize.height * 2 - src.rows| ≤ 2;
也就是说降采样的意思其实是把图像的尺寸缩减一半,行和列同时缩减一半。所以你指定的大小,无非就是多一行少一列的区别而已。在大多数情况下使用默认值就可了,因为这个函数不是缩减图像至任意尺寸,就只是缩减一半,所以没必要搞得那么复杂。
这个缩减的过程是这样的,隔行隔列删去图像中的对应行和列!由此我们也可以看出,这样缩减会带来的影响就是:原图中那些精细的细节边缘等地方,会因此变得锯齿状,产生失真,因此为了缩小之后图像看起来自然,必须进行平滑,这也就是这个算法为什么在降采样之前先对图像进行了高斯模糊的原因。高斯平滑采用的是下面的计算kernel:

pyrUp()函数
函数原型:
void pyrUp(InputArray src, OutputArray dst, const Size& dstsize=Size());
函数作用:
先对图像进行升采样(将图像尺寸行和列方向增大一倍),然后再进行高斯平滑;
函数说明:
同样是最后一个参数,在默认的情况下,这个尺寸大小是按照 Size(src.cols2, (src.rows2) 来计算的。如果你自己要指定大小,那么一定要满足下面的条件:
|dstsize.width - src.cols * 2| ≤ (dstsize.width mod 2); //如果width是偶数,那么必须dstsize.width是src.cols的2倍;
|dstsize.height - src.rows * 2| ≤ (dstsize.height mod 2);
然后这个函数运行的过程就是先将图像的尺寸行和列方向都放大一倍,然后进行高斯平滑,不过此时高斯平滑的kernel是上面pyrDown()中的kernel乘上4,而不是完全相同。( 其实也很容易理解,行和列方向各放大一倍的结果就是图像的面积放大四倍,所以这里给之前的kernel乘以4)。
hough变换
hough线性变换中检测直线有两种,其中cv2.HoughLines()函数是在二值图像中查找直线,cv2.HoughLinesP()函数可以查找直线段。
cv2.HoughLinesP()函数
cv2.HoughLinesP()函数原型:
python:
HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)
C++:
void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold,double minLineLength=0, double maxLineGap=0 )
image: 必须是二值图像,推荐使用canny边缘检测的结果图像;
rho: 线段以像素为单位的距离精度,double类型的,推荐用1.0
theta: 线段以弧度为单位的角度精度,推荐用numpy.pi/180
threshod: 累加平面的阈值参数,int类型,超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。根据情况推荐先用100试试
lines:这个参数的意义未知,发现不同的lines对结果没影响,但是不要忽略了它的存在
minLineLength:线段以像素为单位的最小长度,根据应用场景设置
maxLineGap:同一方向上两条线段判定为一条线段的最大允许间隔(断裂),超过了设定值,则把两条线段当成一条线段,值越大,允许线段上的断裂越大,越有可能检出潜在的直线段
cv2.HoughLines()函数
void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 )
image:边缘检测的输出图像. 它应该是个灰度图 (但事实上是个二值化图)
lines:储存着检测到的直线的参数对(r,theta) 的容器
rho:参数极径 r以像素值为单位的分辨率. 我们使用 1 像素.
theta:参数极角 theta以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)
theta:要”检测” 一条直线所需最少的的曲线交点
srn and stn: 参数默认为0.
参考
https://blog.csdn.net/woainishifu/article/details/62888228
https://blog.csdn.net/dcrmg/article/details/78880046
1924

被折叠的 条评论
为什么被折叠?



