2024年OpenCV图像处理入门_opencv alpha和beta,2024年最新作为一个大数据开发开发者

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取


其中cv2.MORPH\_BLACKHAT表示的就是黑帽操作的意思,kernel表示卷积核。  
 然后我们看一下图像处理的核心函数:



k=np.ones((5,5),np.uint8)
r=cv2.morphologyEx(o,cv2.MORPH_BLACKHAT,k)


得到的结果是:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/bffe73a92d3448be91561721042a3324.png)  
 可以看到我们把图像中的小气泡都取出来了。


### ⭐️2.Sobel算子理论基础及实际操作


首先我们来了解一个边界的定义,看一个图来理解更加的明白。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8088b67af49f49d1aaad12e981e37763.png)  
 对于如图中的水平梯度,我们看A、B两个地方,右侧像素值减去左侧像素值不为0,那么我们就说在此图中A列和B列是边界,否则不是边界。同样对于垂直梯度我们也是这样定义。  
 对于Sobel算子,我们先来看x方向他进行了什么操作:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/a7052dd3d4ba47409d9a5b8cf1a02c99.png)  
 P5x=(p3-p1)+2\*(p6-p4)+(p9-p7)  
 右侧像素值减去左侧像素值,中间行参数稍大为2。  
 同样对于y轴方向也做了一个同样的操作,  
 P5y=(p7-p1)+2\*(p8-p2)+(p9-p3)  
 下一行像素值减去上一行像素值,中间列参数稍大为2  
 然后我们计算了一个近似梯度值:  
 G= 根号(𝐺𝑥2 + 𝐺𝑦2)  
 简化版本就是:  
 G=|𝐺𝑥|+| 𝐺𝑦|  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/26369b37dce44870a99ee1942243e2f3.png)  
 这中心点的P5的Sobel算子就是按照这个方式进行计算。  
 对于P5点完成的Sobel算子计算就是这样:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ac8af0a1c71e4e0eb5e7b3f7036096aa.png)  
 那么好,我们来看一下在python中对于Sobel是一个什么样的函数:



dst = cv2.Sobel( src , ddepth , dx , dy , [ksize] )


其中src表示原始图像,ddeph表示图像的深度,那么我们一般设定为-1,用来表示和原图像保持一致。dx,dy表示x轴的方向或者y轴的方向,ksize表示核大小。  
 其中我们在已经知道的256色位图中,白色点像素值255,黑色点像素值0。  
 **这里对于dx,dy方向为什么我们取绝对值进行一下解答,因为加入一块黑块在一个白色背景下,那么我们在水平方向上,左侧那么得到的数值就是一个负数,对于右侧那么我们得到的是就是一个正常的正数,那么对于OpenCV来说,当我们没有加绝对值得时候如果出现了负数,统一处理成0。**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5c1614c0ddd94f2c9d41a43e4487a80d.png)  
 根据图我们就可以知道,左侧的线被OpenCV处理成了0。所以我们这里要加上一个绝对的运算。无论对于水平方向还是垂直方向都是如此。  
 然后我们要将原始图像处理成256为的色位图。其函数是:



dst = cv2.convertScaleAbs( src [, alpha[, beta]] )


**目标图像=调整(原始图像\*alpha+beta)**  
 其中alpha和beta可以理解为权重的意思。  
 当我们想要计算水平方向上的Sobel算子的时候,那么我们就设定函数中的参数dx=1,dy=0.对于垂直方向也是如此。那么这里我们就会想:如果我们两个方向都一起设置这样是不是比计算完x的方向然后计算y方向,然后进行结合这样是不是更加的方便一些呢?也就是说下图中的方式一比方式二更加的简介方便呢?  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/35dda76dbdaa48c5b3cfd64ffd4a7a03.png)  
 事实上不是这样的,而且两个图像有很大的差异,这个我们后续会看到结果。  
 那么当我们完成了这一步操作之后,我们还要做两个图像的权重和,其函数是:



dst=cv2.addWeighted( src1 , alpha , src2 , beta , gamma )


这里我们说的通俗一点就是,src1表示计算的x轴方向的图像,alpha表示x轴方向上的图像所占的比重,src2表示计算的y轴方向的图像,beta表示y轴方向上的图像所占的比重是多少,最后gamma表示一个修正数值。



> 
> dst(I)=saturate(src1(I)\*alpha+src2(I)\*beta+gamma)
> 
> 
> 


接下来我们来验证一下各个结果:



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算子,得到的结果是:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/80fd07998af74fb5bb145107ab2cd093.png)  
 很明显左侧的没有计算出来。



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()


当我们加上绝对值后的结果是:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/fe81ae124aa140a292c173506dbd4658.png)  
 对于垂直方向的结果也是如此。最后我们计算出x,y的方向。进行融合并且和直接将x,y表示成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)
sobelxy11=cv2.Sobel(o,cv2.CV_64F,1,1)
sobelxy11=cv2.convertScaleAbs(sobelxy11)


![在这里插入图片描述](https://img-blog.csdnimg.cn/13a0c2e699bd437db2cad4dfc23c5f9b.png)  
 根据结果我们可以得到:使用了dx,dy的情况下无法检测到边。然后我们用lena来测试一下结果。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/54e0a1e2c0a44018986f4fe9c038f681.png)  
 在我们相加表示的情况下,边缘检测的线条十分清晰,将分割的地带表达的特别清楚。


### ⭐️3.Scharr算子简介及相关操作


经过大量的科学家验证,发现3\*3的Sobel算子可能并不是特别的精确,于是又提出了相应的Scharr算子,其实就是改变了运算的尺度而已。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3117bda705764a8d89b0155620085f53.png)  
 Sobel算子由原来的121变为了3 10 3,这样的一个组合。其余的操作都是和Sobel算子一致我们来简要的说明一下:  
 **dst=Scharr(src, ddpeth, dx, dy)**  
 这里面少了核的大小,但是和Sobel算子依然一直,参数这里就不解释了,唯一不同的就是我们使用Sobel算子可以设置成dx=1,dy=1。那么对于Scharr算子如果这样设置就会报错。这里需要注意一下。满足条件:  
 **dx >= 0 && dy >= 0 && dx+dy == 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()


![在这里插入图片描述](https://img-blog.csdnimg.cn/f244c1c90d584a0ebe8a86b32617ed4a.png)


### ⭐️4.Sobel算子和Scharr算子的比较


对于上述我们的测试图,其实看不出来Sobel算子和Scharr算子到底有什么区别,看起来是一致的,那么我们这里使用大美女lena进行一次Sobel和Scharr,得到结果进行对比一下可以知道:



sobelx = cv2.Sobel(o,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(o,cv2.CV_64F,0,1,ksize=3)
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)


![在这里插入图片描述](https://img-blog.csdnimg.cn/21396ecb993248fb96054c314b7626b4.png)  
 很明显,这里我们看一下了lena的肩膀部分,可以看到使用Shcarr算子进行计算的时候,刻画的更加细致。


### ⭐️5.laplacian算子简介及相关操作


拉普拉斯算子类似于二阶sobel导数。实际上,在OpenCV中通过调用sobel算子来计算拉普拉斯算子。使用的公式为:  
 **∆𝑠𝑟𝑐 = 𝜕2𝑠𝑟𝑐/𝜕𝑥2 + 𝜕2𝑠𝑟𝑐/𝜕𝑦2**  
 使用的卷积核也和Sobel和Shcarr算子的不一致:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/622bd5b5c09c4626bd84977487cafcfd.png)


看起来有点像高斯的,哈哈哈。  
 这里我们进行一下讲解,  
 P5new=(p2+p4+p6+p8)-4\*p5  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ac6299ba16544d57a5d3f4b34148f33d.png)  
 当没有处于边界的时候呢,我们可以得到P5的数值是变化不大的,当处于边界的时候,P5的数值是变化非常大的,这是因为什么呢?  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/16138601c479494aa377e56e8d45d559.png)  
 对于拉普拉斯算子的函数估计我们也可以猜到:  
 **dst = cv2.Laplacian( src, ddepth )**  
 自然是没有水平方向和垂直方向的。  
 **实际操作中,计算梯度值可能会出现负数。通常处理的图像是np.uint8类型,如果结果也是该类型,所有负数会自动截断为0,发生信息丢失。所以,通常计算时,使用更高的数据类型cv2.CV\_64F,取绝对值后,再转换为np.uint(cv2.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()

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

9ZOAd-1714852485356)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
编译安装OpenCV 3.2和OpenCV_contrib的步骤如下: 1. 首先,下载OpenCV 3.2的源代码和OpenCV_contrib的扩展模块源代码。可以从OpenCV的官方网站或GitHub上获取这些源代码。 2. 解压下载的OpenCV 3.2源代码文件和OpenCV_contrib源代码文件,并将它们分别放置在不同的目录中。 3. 在终端中打开一个新的命令窗口,并导航到OpenCV的源代码目录。 4. 创建一个新的目录,用于保存编译后的OpenCV库文件。建议在源代码目录之外的某个位置创建此目录。 5. 在终端中输入以下命令来设置编译选项和安装路径: ``` cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/path/to/opencv_libs \ -D OPENCV_EXTRA_MODULES_PATH=/path/to/opencv_contrib/modules \ /path/to/opencv_source ``` 其中,`/path/to/opencv_libs`是你创建的用于保存库文件的目录路径,`/path/to/opencv_contrib/modules`是OpenCV_contrib源代码的路径,`/path/to/opencv_source`是OpenCV源代码的路径。 6. 输入以下命令编译和安装OpenCV库文件: ``` make -j4 sudo make install ``` 这将会使用4个线程(可根据你的机器性能进行调整)进行编译,并将编译后的文件安装在指定的安装路径中。 7. 安装完成后,可以在指定的安装路径中找到生成的OpenCV库文件。在你的项目中,应该设置正确的头文件和库文件路径来使用OpenCV。 这些是基本的步骤来编译和安装OpenCV 3.2和OpenCV_contrib。请注意,在编译和安装过程中,可能会遇到依赖问题或其他错误,这可能需要进一步的配置和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值