在百度做网站怎么做开发app小程序

当前位置: 首页 > news >正文

在百度做网站怎么做,开发app小程序,徐州百度运营中心,平台一直维护是不是要跑路了目录 前言 推荐 1、OpenCV礼帽操作和黑帽操作 2、Sobel算子理论基础及实际操作 3、Scharr算子简介及相关操作 4、Sobel算子和Scharr算子的比较 5、laplacian算子简介及相关操作 6、Canny边缘检测的原理 6.1 去噪 6.2 梯度运算 6.3 非极大值抑制 6.4 滞后阈值 7、Ca… 目录 前言 推荐 1、OpenCV礼帽操作和黑帽操作 2、Sobel算子理论基础及实际操作 3、Scharr算子简介及相关操作 4、Sobel算子和Scharr算子的比较 5、laplacian算子简介及相关操作 6、Canny边缘检测的原理 6.1 去噪 6.2 梯度运算 6.3 非极大值抑制 6.4 滞后阈值 7、Canny边缘检测的函数及使用 前言 本文将非常细致的讲解相关与计算机视觉OpenCV图像处理的相关知识即操作非常的简单易懂。 推荐 前些天发现了一个巨牛的人工智能学习网站通俗易懂风趣幽默忍不住分享一下给大家。点击跳转到网站 1、OpenCV礼帽操作和黑帽操作 图像顶帽操作也叫图像礼帽操作实际上就是结果图像原图像-图像开运算 那么我们知道图像的开运算就是对图像先腐蚀操作然后在进行膨胀操作得到的图像其实就是进行了取噪的一个处理然后我们所说的礼帽图像操作就是使用原图像-图像的开运算操作。 函数依旧是 result cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)其中img表示原始图像cv2.MORPH_TOPHAT表示进行礼帽操作然后kernel表示卷积核这里我们之前已经讲过。 核心函数是 knp.ones((5,5),np.uint8) rcv2.morphologyEx(o,cv2.MORPH_TOPHAT,k)这样我们显示以下我们处理的图像就可以知道 处理之后我们得到了相应的噪声结果。 图像黑帽操作就是图像的闭运算-原图像黑帽结果图像图像闭运算-原图像 我们之前也介绍过这个闭运算操作就是先对图像进行膨胀操作然后进行腐蚀操作。 函数是 result cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) 其中cv2.MORPH_BLACKHAT表示的就是黑帽操作的意思kernel表示卷积核。 然后我们看一下图像处理的核心函数 knp.ones((5,5),np.uint8) rcv2.morphologyEx(o,cv2.MORPH_BLACKHAT,k)得到的结果是 可以看到我们把图像中的小气泡都取出来了。 2、Sobel算子理论基础及实际操作 首先我们来了解一个边界的定义看一个图来理解更加的明白。 对于如图中的水平梯度我们看A、B两个地方右侧像素值减去左侧像素值不为0那么我们就说在此图中A列和B列是边界否则不是边界。同样对于垂直梯度我们也是这样定义。 对于Sobel算子我们先来看x方向他进行了什么操作 P5x(p3-p1)2(p6-p4)(p9-p7) 右侧像素值减去左侧像素值中间行参数稍大为2。 同样对于y轴方向也做了一个同样的操作 P5y(p7-p1)2(p8-p2)(p9-p3) 下一行像素值减去上一行像素值中间列参数稍大为2 然后我们计算了一个近似梯度值 G 根号2 2 简化版本就是 G||| | 这中心点的P5的Sobel算子就是按照这个方式进行计算。 对于P5点完成的Sobel算子计算就是这样 那么好我们来看一下在python中对于Sobel是一个什么样的函数 dst cv2.Sobel( src , ddepth , dx , dy , [ksize] ) 其中src表示原始图像ddeph表示图像的深度那么我们一般设定为-1用来表示和原图像保持一致。dxdy表示x轴的方向或者y轴的方向ksize表示核大小。 其中我们在已经知道的256色位图中白色点像素值255黑色点像素值0。 这里对于dxdy方向为什么我们取绝对值进行一下解答因为加入一块黑块在一个白色背景下那么我们在水平方向上左侧那么得到的数值就是一个负数对于右侧那么我们得到的是就是一个正常的正数那么对于OpenCV来说当我们没有加绝对值得时候如果出现了负数统一处理成0。   根据图我们就可以知道左侧的线被OpenCV处理成了0。所以我们这里要加上一个绝对的运算。无论对于水平方向还是垂直方向都是如此。 然后我们要将原始图像处理成256为的色位图。其函数是 dst cv2.convertScaleAbs( src [, alpha[, beta]] ) 目标图像调整原始图像*alphabeta 其中alpha和beta可以理解为权重的意思。 当我们想要计算水平方向上的Sobel算子的时候那么我们就设定函数中的参数dx1dy0.对于垂直方向也是如此。那么这里我们就会想如果我们两个方向都一起设置这样是不是比计算完x的方向然后计算y方向然后进行结合这样是不是更加的方便一些呢也就是说下图中的方式一比方式二更加的简介方便呢 事实上不是这样的而且两个图像有很大的差异这个我们后续会看到结果。 那么当我们完成了这一步操作之后我们还要做两个图像的权重和其函数是 dstcv2.addWeighted( src1 , alpha , src2 , beta , gamma 这里我们说的通俗一点就是src1表示计算的x轴方向的图像alpha表示x轴方向上的图像所占的比重src2表示计算的y轴方向的图像beta表示y轴方向上的图像所占的比重是多少最后gamma表示一个修正数值。 dst(I)saturate(src1(I)*alphasrc2(I)*betagamma) 接下来我们来验证一下各个结果 import cv2 import numpy as np o cv2.imread(image\sobel4.bmp,cv2.IMREAD_GRAYSCALE) sobelx cv2.Sobel(o,-1,1,0) cv2.imshow(original,o) cv2.imshow(x,sobelx) cv2.waitKey() cv2.destroyAllWindows()这里我们没有加上绝对值计算x轴方向上的Sobel算子得到的结果是 很明显左侧的没有计算出来。 import cv2 import numpy as np o cv2.imread(image\sobel4.bmp,cv2.IMREAD_GRAYSCALE) sobelx cv2.Sobel(o,cv2.CV_64F,1,0) sobelx cv2.convertScaleAbs(sobelx) # 转回uint8 cv2.imshow(original,o) cv2.imshow(x,sobelx) cv2.waitKey() cv2.destroyAllWindows()当我们加上绝对值后的结果是 对于垂直方向的结果也是如此。最后我们计算出xy的方向。进行融合并且和直接将xy表示成1的结果进行一下对比我们来看结果 核心代码 sobelx cv2.Sobel(o,cv2.CV_64F,1,0) sobely cv2.Sobel(o,cv2.CV_64F,0,1) sobelx cv2.convertScaleAbs(sobelx) # 转回uint8 sobely cv2.convertScaleAbs(sobely) sobelxy cv2.addWeighted(sobelx,0.5,sobely,0.5,0) sobelxy11cv2.Sobel(o,cv2.CV_64F,1,1) sobelxy11cv2.convertScaleAbs(sobelxy11)根据结果我们可以得到使用了dxdy的情况下无法检测到边。然后我们用lena来测试一下结果。 在我们相加表示的情况下边缘检测的线条十分清晰将分割的地带表达的特别清楚。 3、Scharr算子简介及相关操作 经过大量的科学家验证发现3*3的Sobel算子可能并不是特别的精确于是又提出了相应的Scharr算子其实就是改变了运算的尺度而已。 Sobel算子由原来的121变为了3 10 3这样的一个组合。其余的操作都是和Sobel算子一致我们来简要的说明一下 dstScharr(src, ddpeth, dx, dy) 这里面少了核的大小但是和Sobel算子依然一直参数这里就不解释了唯一不同的就是我们使用Sobel算子可以设置成dx1dy1。那么对于Scharr算子如果这样设置就会报错。这里需要注意一下。满足条件 dx 0 dy 0 dxdy 1   import cv2 import numpy as np o cv2.imread(image\scharr.bmp,cv2.IMREAD_GRAYSCALE) scharrx cv2.Scharr(o,cv2.CV_64F,1,0) scharry cv2.Scharr(o,cv2.CV_64F,0,1) scharrx cv2.convertScaleAbs(scharrx) # 转回uint8 scharry cv2.convertScaleAbs(scharry) scharrxy cv2.addWeighted(scharrx,0.5,scharry,0.5,0) cv2.imshow(original,o) cv2.imshow(x,scharrx) cv2.imshow(y,scharry) cv2.imshow(xy,scharrxy) cv2.waitKey() cv2.destroyAllWindows()4、Sobel算子和Scharr算子的比较 对于上述我们的测试图其实看不出来Sobel算子和Scharr算子到底有什么区别看起来是一致的那么我们这里使用大美女lena进行一次Sobel和Scharr得到结果进行对比一下可以知道 sobelx cv2.Sobel(o,cv2.CV_64F,1,0,ksize3) sobely cv2.Sobel(o,cv2.CV_64F,0,1,ksize3) sobelx cv2.convertScaleAbs(sobelx) # 转回uint8 sobely cv2.convertScaleAbs(sobely) sobelxy cv2.addWeighted(sobelx,0.5,sobely,0.5,0) scharrx cv2.Scharr(o,cv2.CV_64F,1,0) scharry cv2.Scharr(o,cv2.CV_64F,0,1) scharrx cv2.convertScaleAbs(scharrx) # 转回uint8 scharry cv2.convertScaleAbs(scharry) scharrxy cv2.addWeighted(scharrx,0.5,scharry,0.5,0)很明显这里我们看一下了lena的肩膀部分可以看到使用Shcarr算子进行计算的时候刻画的更加细致。 5、laplacian算子简介及相关操作 拉普拉斯算子类似于二阶sobel导数。实际上在OpenCV中通过调用sobel算子来计算拉普拉斯算子。使用的公式为∆ 22 22 使用的卷积核也和Sobel和Shcarr算子的不一致 看起来有点像高斯的哈哈哈。 这里我们进行一下讲解 P5new(p2p4p6p8)-4*p5 当没有处于边界的时候呢我们可以得到P5的数值是变化不大的当处于边界的时候P5的数值是变化非常大的这是因为什么呢? 对于拉普拉斯算子的函数估计我们也可以猜到 dst cv2.Laplacian( src, ddepth ) 自然是没有水平方向和垂直方向的。 实际操作中计算梯度值可能会出现负数。通常处理的图像是np.uint8类型如果结果也是该类型所有负数会自动截断为0发生信息丢失。所以通常计算时使用更高的数据类型cv2.CV_64F取绝对值后再转换为np.uintcv2.CV_8U类型。 所以我们还是要取一次绝对值的运算 dst cv2.convertScaleAbs( src )   import cv2 import numpy as np o cv2.imread(image\laplacian.bmp,cv2.IMREAD_GRAYSCALE) laplacian cv2.Laplacian(o,cv2.CV_64F) laplacian cv2.convertScaleAbs(laplacian) # 转回uint8 cv2.imshow(original,o) cv2.imshow(laplacian,laplacian) cv2.waitKey() cv2.destroyAllWindows()我们对lena进行一次拉普拉斯算子操作得到的结果是 6、Canny边缘检测的原理 Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论Computational theory of edge detection解释这项技术如何工作。 Canny 的目标是找到一个最优的边缘检测算法最优边缘检测的含义是 1.最优检测算法能够尽可能多地标识出图像中的实际边缘漏检真实边缘的概率和误检非边缘的概率都尽可能小 2.最优定位准则检测到的边缘点的位置距离实际边缘点的位置最近或者是由于噪声影响引起检测出的边缘偏离物体的真实边缘的程度最小 3.检测点与边缘点一一对应算子检测的边缘点与实际边缘点应该是一一对应。 Canny边缘检测的一般步骤1.去噪 2.梯度运算 3.非极大值抑制 4.滞后阈值。下面我们就分别讲解一下这些操作 6.1 去噪 边缘检测容易受到噪声的影响。因此在进行边缘检测前通常需要先进行去噪。我们一般使用高斯滤波进行图像去噪处理。也就是让临近的像素具有更高的重要度。对周围像素计算加权平均值较近的像素具有较大的权重值。 比较像我们之间讲到的k近邻算法的意思哈。进行去噪处理之后呢我们对于平滑图像进行一次Sobel算子梯度运算。 6.2 梯度运算 根号下2 2 对于方向 −1(/) 对于每一个点计算之后的方向就是这样。大小和方向在图中都已经进行了标记。梯度的方向一般总是与边界垂直。梯度方向被归为四类垂直水平和两个对角线。 6.3 非极大值抑制 在获得了梯度和方向后遍历图像去除所有不是边界的点。实现方法逐个遍历像素点判断当前像素点是否是周围像素点中具有相同方向梯度的最大值。 点A、点B、点C三点具有相同的方向梯度方向垂直于边缘。判断点A是否为点A、点B、点C的局部最大值 如果是保留该点否则它被抑制归零。 这里就表示在垂直方向上进行了抑制取出最大值。 6.4 滞后阈值 这里对非极大值抑制之后我们进行了一次滞后阈值操作分别取一个最小阈值和一个最大阈值然后图像像素点的曲线与最大最小阈值相连则保留如果不相连则抛弃。 我们来看一下边缘检测的结果图 7、Canny边缘检测的函数及使用 Canny边缘检测的函数是edges cv2.Canny( image, threshold1, threshold2 ) threshold1表示阈值1threshold2表示阈值2。也就是我们刚刚介绍到的最大最小阈值。 import cv2 import numpy as np ocv2.imread(image\canny.bmp,cv2.IMREAD_GRAYSCALE) rcv2.Canny(o,100,200) cv2.imshow(original,o) cv2.imshow(result,r) cv2.waitKey() cv2.destroyAllWindows()然后我们在对lena做一次结果是 调整阈值可以控制边缘细节。maxVal、minVal变小有更多的细节信息。 如果觉得博主的文章还不错或者您用得到的话可以免费的关注一下博主如果三连收藏支持就更好啦这就是给予我最大的支持