【OpenCV】 Canny边缘检测 图像轮廓检测 直方图均衡化_opencv canny边缘检测 轮廓

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

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

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

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

如果某个像素点是边缘,则其梯度方向总是垂直与边缘垂直。

梯度方向被归为四类:垂直,水平,和两个对角线方向。

第三步:非极大值抑制

在获得梯度的方向和大小之后,对整幅图像进行扫描,去除那些非边界上的点。对每一个像素进行检查,看这个点的梯度是不是周围具有相同梯度方向的点中最大的。如下图所示:

A点位于图像的边缘,在其梯度变化方向,选择像素点B和C,用来检验A点的梯度是否为极大值,若为极大值,则进行保留,否则A点被抑制,最终的结果是具有“细边”的二进制图像。

第四步:滞后阈值

现在要确定真正的边界。 我们设置两个阈值:\boldsymbol{\textrm{ minVal }} 和 \boldsymbol{\textrm{maxVal}} 。 
当图像的灰度梯度高于\boldsymbol{\textrm{maxVal}}时被认为是真的边界, 低于 \boldsymbol{\textrm{ minVal }}的边界会被抛弃。如果介于两者之间的话,就要看这个点是否与某个被确定为真正的边界点相连,如果是就认为它也是边界点,如果不是就抛弃。如下图:

如上图所示,A 高于阈值 \boldsymbol{\textrm{maxVal}}所以是真正的边界点,C 虽然低于\boldsymbol{\textrm{maxVal}}但高于 \boldsymbol{\textrm{ minVal }}并且与 A 相连,所以也被认为是真正的边界点。而 B 就会被抛弃,因为低于 \boldsymbol{\textrm{maxVal}}而且不与真正的边界点相连。所以选择合适的 \boldsymbol{\textrm{maxVal}}\boldsymbol{\textrm{ minVal }}对于能否得到好的结果非常重要。(指定的越大,标准越高,指定的越小,标准越低)

💬API

canny = cv2.Canny(image, threshold1, threshold2)

💎示例:

img = cv2.imread('sun.jpg')
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
v1 = cv2.Canny(img, 80, 150)
v2 = cv2.Canny(img, 50, 100)
res = np.hstack((v1,v2))

cv2.imshow('res', res)
cv2.waitKey(0)  # 等待时间,毫秒级,0表示按任意键终止
cv2.destroyAllWindows()

Ⅱ. 图像轮廓

0x00 轮廓检测

💬API

cv2.findContours(img,mode,method)

mode:轮廓检索模式

  • RETR_EXTERNAL:只检索最外面的轮廓;-
  • RETR_LIST:检索所有的轮廓,并将其保存到-条链表当中;
  • RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:层是各部分的外部边界,第二层是空洞的边界;
  • RETR_TREE:检索所有的轮廓,瓶构嵌套轮廓的整个层次;(最常用,可检测所有)

method:轮廓逼近方法

  • CHAIN_ APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
  • CHAIN APPROX_SIMPLE:压缩水平的、 殖的和斜的部分,也就是,函数只保留他们的终点部分。

Ⅲ. 直方图

0x00 灰度直方图

原理
直方图是对数据进行统计的一种方法,并且将统计值组织到一系列实现定义好的 bin 当中。

其中, bin 为直方图中经常用到的一个概念,可以译为 “直条” 或 “组距”,其数值是从数据中计算出的特征统计量,这些数据可以是诸如梯度、方向、色彩或任何其他特征。

图像直方图(Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素个数。

这种直方图中,横坐标的左侧为较暗的区域,而右侧为较亮的区域。因此一张较暗图片的直方图中的数据多集中于左侧和中间部分,而整体明亮、只有少量阴影的图像则相反。

📌 注意:直方图是根据灰度图进行绘制的,而不是彩色图像。

假设有一张图像的信息(灰度值 0 - 255,已知数字的范围包含 256 个值,于是可以按一定规律将这个范围分割成子区域(也就是 bins)。如:

然后再统计每一个 bin(i) 的像素数目。可以得到下图(其中 x 轴表示 bin,y 轴表示各个 bin 中的像素个数):

直方图的一些术语和细节

  • dims:需要统计的特征数目。在上例中,dims = 1 ,因为仅仅统计了灰度值。
  • bins:每个特征空间子区段的数目,可译为 “直条” 或 “组距”,在上例中, bins = 16。
  • range:要统计特征的取值范围。在上例中,range = [0, 255]。

直方图的意义

  • 直方图是图像中像素强度分布的图形表达方式。
  • 它统计了每一个强度值所具有的像素个数。
  • 不同的图像的直方图可能是相同的

直方图的计算和绘制
我们使用OpenCV中的方法统计直方图,并使用matplotlib将其绘制出来。

💬API

cv2.calcHist(images,channels,mask,histSize,ranges[,hist[,accumulate]])

参数:

  • images: 原图像。当传入函数时应该用中括号 [] 括起来,例如:[img]。
  • channels: 如果输入图像是灰度图,它的值就是 [0];如果是彩色图像的话,传入的参数可以是 [0],[1],[2] 它们分别对应着通道 B,G,R。
  • mask: 掩模图像。要统计整幅图像的直方图就把它设为 None。但是如果你想统计图像某一部分的直方图的话,你就需要制作一个掩模图像,并使用它。(后边有例子)
  • histSize: BIN 的数目。也应该用中括号括起来,例如:[256]。
  • ranges: 像素值范围,通常为 [0,256]

💎示例:

绘制灰度直方图

# 1 直接以灰度图的方式读入
img = cv2.imread('sun.jpg',0)#0表示灰度图
# 2 统计灰度图
hist = cv2.calcHist([img], [0], None, [256], [0,256])
# 3 绘制灰度图
plt.figure(figsize=(10,6),dpi=100)
plt.plot(hist)
plt.grid()
plt.show()

绘制彩色直方图

img = cv2.imread('sun.jpg')
color=('b', 'g', 'r')
for i,col in enumerate(color):
    histr =cv2.calcHist([img],[i], None,[256],[0,256])
    plt.plot(histr,color=col)
    plt.xlim([0,256])
plt.show()

0x01 掩膜

掩膜是用选定的图像、图形或物体,对要处理的图像进行遮挡,来控制图像 处理的区域。

在数字图像处理中,我们通常使用二维矩阵数组进行掩膜。掩膜是由0和1组成一个二进制图像,利用该掩膜图像要处理的图像进行掩膜,其中1值的区域被处理,0 值区域被屏蔽,不会处理。

掩膜的主要用途是:

  • 提取感兴趣区域:用预先制作的感兴趣区掩模与待处理图像进行”与“操作,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。
  • 屏蔽作用:用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
  • 结构特征提取:用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。
  • 特殊形状图像制作

掩膜在遥感影像处理中使用较多,当提取道路或者河流,或者房屋时,通过一个掩膜矩阵来对图像进行像素过滤,然后将我们需要的地物或者标志突出显示出来。

我们使用cv.calcHist()来查找完整图像的直方图。

如果要查找图像某些区域的直方图,该怎么办?

只需在要查找直方图的区域上创建一个白色的掩膜图像,否则创建黑色, 然后将其作为掩码mask传递即可。

💎示例:

# 1. 直接以灰度图的方式读入
img = cv2.imread('sun.jpg', 0)
# 2. 创建蒙版
mask = np.zeros(img.shape[:2], np.uint8)
mask[400:650, 200:500] = 255
# 3.掩模
masked_img = cv2.bitwise_and(img,img,mask = mask)
# 4. 统计掩膜后图像的灰度图
mask_histr = cv2.calcHist([img],[0],mask,[256],[1,256])
# 5. 图像展示


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

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
![img](https://img-blog.csdnimg.cn/img_convert/6564fa958c99dc473321b3f414652523.png)

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

sk,[256],[1,256])
# 5. 图像展示


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

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
[外链图片转存中...(img-ySt3T1LR-1713348947533)]

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

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值