OpenCV 09(形态学)

这篇具有很好参考价值的文章主要介绍了OpenCV 09(形态学)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、形态学

形态学指一系列处理图像 形状特征 的图像处理技术.

  • 形态学的基本思想是利用一种特殊的结构元(本质上就是卷积核)来测量或提取输入图像中相应的形状或特征,以便进一步进行图像分析和目标识别。
  • 这些处理方法基本是对二进制图像进行处理, 即黑白图像
  • 卷积核决定着图像处理后的效果


形态学常用基本操作有:

    - 膨胀和腐蚀
    - 开运算
    - 闭运算
    - 顶帽
    - 黑帽

1.1 图像全局二值化 

二值化: 将图像的每个像素变成两种值, 比如0,  255

0和255:0是黑色,255是白色

01: 0是黑色,1是白色

- threshold(src, thresh, maxval, type[, dst])

  - src 最好是灰度图

  - thresh: 阈值

  - maxval: 最大值, 最大值不一定是255

  - type: 操作类型.常见操作类型如下:

OpenCV 09(形态学),opencv,cnn,人工智能

 import cv2
  import numpy as np
  
  img = cv2.imread('./dog.jpeg')
  
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  
  # 返回两个结果, 一个是阈值, 另一个是处理后的图片
  ret, dst = cv2.threshold(gray, 80, 255, cv2.THRESH_BINARY)
  
  cv2.imshow('dog', np.hstack((gray, dst)))
  
  cv2.waitKey(0)
  cv2.destroyAllWindows()

OpenCV 09(形态学),opencv,cnn,人工智能

1.2 自适应阈值二值化

在前面的部分我们使用是全局阈值,整幅图像采用同一个数作为阈值。当时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。

adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)**
 这种方法需要我们指定六个参数,返回值只有一个。

 • **Adaptive Method**- 指定计算阈值的方法。
 – **cv2.ADPTIVE_THRESH_MEAN_C**:阈值取自相邻区域的平均值
 – **cv2.ADPTIVE_THRESH_GAUSSIAN_C**:阈值取值相邻区域的加权和,权重为一个高斯窗口。 
 • **Block Size** - 邻域大小(用来计算阈值的区域大小)。
 • **C** - 这就是是一个常数,阈值就等于的平均值或者加权平均值减去这个常数。

# 因为光线问题, 全局二值化导致有部分地方看不见了.这时就需要自适应阈值二值化了.
import cv2
import numpy as np

img = cv2.imread('./math.png')

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.resizeWindow('img', 1920, 1080)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 自适应阈值二值化只返回一个值, 即二值化后的结果
dst = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 3, 0)

cv2.imshow('img', np.hstack((gray, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 09(形态学),opencv,cnn,人工智能

 

1.3  腐蚀操作

 腐蚀操作也是用卷积核扫描图像, 只不过腐蚀操作的卷积一般都是1, 如果卷积核内所有像素点都是白色, 那么锚点即为白色. 

OpenCV 09(形态学),opencv,cnn,人工智能

- 大部分时候腐蚀操作使用的都是全为1的卷积核.

OpenCV 09(形态学),opencv,cnn,人工智能

- erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

  - iterations是腐蚀操作的迭代次数, 次数越多, 腐蚀操作执行的次数越多, 腐蚀效果越明显

import cv2
import numpy as np

img = cv2.imread('./msb.png')

kernel = np.ones((3, 3), np.uint8)

dst = cv2.erode(img, kernel, iterations=2)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 09(形态学),opencv,cnn,人工智能

 

 

1.4 获取形态学卷积核

- opencv提供了获取卷积核的api.不需要我们手工创建卷积核.
- getStructuringElement(shape, ksize[, anchor])

  - shape是指卷积核的形状, 注意不是指长宽, 是指卷积核中1形成的形状.
    - MORPH_RECT 卷积核中的1是矩形, 常用.
    - MORPH_ELLIPSE 椭圆
    - MORPH_CROSS 十字

import cv2
import numpy as np

img = cv2.imread('./j.png')

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.erode(img, kernel, iterations=2)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

1.5 膨胀操作

膨胀是腐蚀的相反操作, 基本原理是只要保证卷积核的锚点是非0值, 周边无论是0还是非0值, 都变成非0值.

OpenCV 09(形态学),opencv,cnn,人工智能

- dilate(img, kernel, iterations=1)

import cv2
import numpy as np

img = cv2.imread('./j.png')

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.dilate(img, kernel, iterations=2)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 09(形态学),opencv,cnn,人工智能

 

1.6 开运算

 开运算和闭运算都是腐蚀和膨胀的基本应用. 

- 开运算 = 腐蚀 + 膨胀
- morphologyEx(img, MORPH_OPEN, kernel)

  - MORPH_OPEN 表示形态学的开运算
  - kernel 如果噪点比较多, 会选择大一点的kernel, 如果噪点比较小, 可以选择小点的kernel

import cv2
import numpy as np

img = cv2.imread('./dotj.png')

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

# 腐蚀
# dst = cv2.erode(img, kernel, iterations=2)

# # 膨胀
# dst = cv2.dilate(dst, kernel, iterations=2)

# 直接调用opencv提供的开运算api
dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, iterations=2)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 09(形态学),opencv,cnn,人工智能

1.7 闭运算

- 闭运算 = 膨胀 + 腐蚀

import cv2
import numpy as np

img = cv2.imread('./dotinj.png')

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, iterations=2)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 09(形态学),opencv,cnn,人工智能

1.8 形态学梯度

- 梯度 = 原图  -  腐蚀
- 腐蚀之后原图边缘变小了, 原图 - 腐蚀 就可以得到腐蚀掉的部分, 即边缘.

import cv2
import numpy as np

img = cv2.imread('./j.png')

# 注意调节kernel大小以获得更清晰的边缘
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel, iterations=1)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 09(形态学),opencv,cnn,人工智能

1.9 顶帽运算

- 顶帽 = 原图 - 开运算
- 开运算的效果是去除图像外的噪点, 原图 - 开运算就得到了去掉的噪点.

import cv2
import numpy as np

img = cv2.imread('./tophat.png')

# 注意调整kernel以保留小图形
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (19, 19))

dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel, iterations=1)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 09(形态学),opencv,cnn,人工智能

 

1.10 黑帽操作

- 黑帽 = 原图 - 闭运算
- 闭运算可以将图形内部的噪点去掉, 那么原图 - 闭运算的结果就是图形内部的噪点.

import cv2
import numpy as np

img = cv2.imread('./dotinj.png')

# 注意调节kernel大小以获得更清晰的边缘
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))

dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel, iterations=1)

cv2.imshow('img', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 09(形态学),opencv,cnn,人工智能文章来源地址https://www.toymoban.com/news/detail-733577.html

到了这里,关于OpenCV 09(形态学)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV(三十一):形态学操作

    ​​​​​​1.形态学操作        OpenCV 提供了丰富的函数来进行形态学操作,包括腐蚀、膨胀、开运算、闭运算等。下面介绍一些常用的 OpenCV 形态学操作函数: 腐蚀操作(Erosion): erode(src, dst, kernel, anchor, iterations, borderType, borderValue) 该函数对输入图像中的前景区域进行

    2024年02月09日
    浏览(52)
  • OpenCV17-图像形态学操作

    图像腐蚀(Image erosion)可用于减小图像中物体的大小、填充孔洞或者分离邻近的物体。腐蚀操作通过对图像中的每个像素应用结构元素(也称为腐蚀内核)来实现。 腐蚀操作的原理是将结构元素与图像进行逐像素的比较。如果结构元素的所有像素与图像中对应位置的像素都

    2024年02月08日
    浏览(50)
  • opencv获取形态学卷积核

    获取形态学卷积核,这个函数是用来创建自定义形状的卷积核(也称为结构元素),这些核可以用在形态学操作比如腐蚀和膨胀中。 cv2.getStructuringElement(shape, ksize[, anchor]) shape:卷积核形状, cv2.MORPH_RECT: 矩形结构元素 cv2.MORPH_CROSS: 交叉形结构元素 cv2.MORPH_ELLIPSE: 椭圆形结构元素

    2024年04月14日
    浏览(46)
  • 10 OpenCV 形态学的应用

    adaptiveThreshold 二值化算子 想法:把获取二值化的图片轮廓,对直线进行开闭运算

    2024年03月13日
    浏览(42)
  • OpenCv之图像形态学(二)

    目录 一、形态学梯度 二、顶帽操作 三、黑帽操作 梯度=原图 - 腐蚀 腐蚀之后原图边缘变小,原图 - 腐蚀 就可以得到腐蚀掉的部分,即边缘 案例代码如下: 运行结果如下: 顶帽 = 原图 - 开运算 开运算的效果是去除图形外的噪点,原图 - 开运算就得到了去掉的噪点 案例代码如

    2024年02月16日
    浏览(44)
  • OpenCV快速入门:图像形态学操作

    图像形态学是一门强大而有趣的技术,它通过对图像进行形态学操作,使图像更适合后续处理步骤。在本文中,我们将深入探讨OpenCV中的图像形态学操作,快速入门这一关键领域。 图像形态学作为数字图像处理的一个分支,致力于通过形态学操作实现对图像特征的提取、噪音

    2024年02月05日
    浏览(97)
  • Python轮廓追踪【OpenCV形态学操作】

    一些理论知识 OpenCV形态学操作理论1 OpenCV形态学操作理论2 OpenCV轮廓操作|轮廓类似详解 代码如下,可以直接运行

    2024年02月22日
    浏览(52)
  • Opencv | 图像卷积与形态学变换操作

    在每个图像位置(x,y)上进行基于邻域的函数计算,其中函数参数被称为卷积核 (kernel) kernel核的尺寸通常为奇数,一般为: 3 ∗ 3 、 5 ∗ 5 、 7 ∗ 7 3*3、5*5、7*7 3 ∗ 3 、 5 ∗ 5 、 7 ∗ 7 不同功能需要定义不同的函数,其中功能可以有: 图像增强:           平滑 / 去

    2024年04月23日
    浏览(41)
  • Android OpenCV(三十一):图像形态学

    参数一:src,输入的待形态学操作图像,图像的通道数可以是任意的,但是图像的数据类型必须是 CV_8U , CV_16U , CV_16S , CV_32F 或 CV_64F 参数二:dst,形态学操作后的输出图像,与输入图像src具有相同的尺寸和数据类型 参数三:op,形态学操作类型的标志 标志位 值 作用 MO

    2024年04月10日
    浏览(48)
  • OpenCV(项目)车牌识别1 -- 车牌提取(形态学)

    目录 一、形态学车牌提取(简单:单情景)  1、读取图片,转灰度图  2、提取轮廓(Sobel算子提取y方向边缘) 3、自适应二值化 4、闭运算处理,把图像闭合、揉团,使图像区域化 5、腐蚀/膨胀去噪得到车牌区域 5-1、横向腐蚀、膨胀 5-2、纵向腐蚀、膨胀 6、获取外轮廓 6-1、

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包