Opencv中的开运算和闭运算操作讲解(python实现)

这篇具有很好参考价值的文章主要介绍了Opencv中的开运算和闭运算操作讲解(python实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.首先了解腐蚀和膨胀原理

https://mydreamambitious.blog.csdn.net/article/details/125265431


2.开运算

开运算=腐蚀+膨胀(顺序不可颠倒)

(1)为什么开运算可以去白噪点呢?

根据腐蚀的原理,使用一个给定大小的卷积核(结构单元)对图像进行卷积,操作是用卷积核(结构元素)B与其覆盖的二值图像A做“与”操作,如果结果为1,那么为1,否则为0;但是对于噪点的话,很多情况下在于卷积核进行与操作之后结果都为0,所以对于二值图像那么就是黑色,也就是白色的噪点变成黑色(相当于白色噪点被去掉)。腐蚀之后图像中的主要部分也会变小(“瘦”),所以需要使用膨胀进行还原;膨胀的过程是使用卷积核与二值图像进行或操作,只要其中有一个为1,则结果为1,否则结果为0.从而达到了去白噪点。
比如下面一张图中,可以看到其中有很多的白色噪点,所以这个时候可以使用开运算操作。

Opencv中的开运算和闭运算操作讲解(python实现)

(2).函数讲解

morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None):

Src:输入的原始图像
Op:进行操作(开运算或者闭运算)
Kernel:卷积核的大小
Dst:输出的图像
Anchor:默认值为(-1,-1),卷积的中心
Iterations:迭代的次数
borderType:用于推断图像外部像素的某种边界模式。注意它有默认值 BORDER_DEFAULT
borderValue:边界值(如果是常量边界)。默认morphologyDefaultBorderValue具有特殊含义。对于侵蚀,它被转换为+\inf;对于膨胀,它被转换为-\inf,这意味着只有在图像内部的像素上才能有效地计算最小值(最大值)

(3)代码实战

import os
import cv2
import random
import numpy as np

#产生白色噪点
def ProduceWhiteNoise(img_path='images/Exen.png'):
    image=cv2.imread(img_path)
    h,w,c=np.shape(image)
    noise=np.zeros(shape=image.shape,dtype=np.uint8)
    # print(np.shape(image))
    #固定产生白噪点的个数
    count=0
    prob=0.95
    for i in range(h):
        for j in range(w):
            sand=random.random()
            if count<=50000 and sand>prob:
                noise[i][j]=255
                count+=1
            else:
                noise[i][j]=image[i][j]
    cv2.imshow('image',noise)
    cv2.waitKey(0)
    cv2.imwrite('images/Exen_copy.png',noise)

#进行开运算的方式一,直接调用开运算函数
def MorphologyExAnd(img_path='images/Exen_copy.png'):
    #读取图片
    img_src=cv2.imread(img_path)
    img=cv2.resize(src=img_src,dsize=(500,500))
    #获取卷积核,这里使用矩阵的方式
    kernel=cv2.getStructuringElement(shape=cv2.MORPH_RECT,ksize=(7,7))
    #进行开运算
    img=cv2.morphologyEx(src=img,op=cv2.MORPH_OPEN,kernel=kernel,iterations=1)
    #显示图片
    cv2.imshow('img_src',img_src)
    cv2.imshow('img',img)
    #等待接收鼠标或者键值
    cv2.waitKey(0)
    cv2.destroyAllWindows()

#进行开运算方式2=腐蚀+膨胀
def Erode_Dilate(img_path='images/Exen_copy.png'):
    #读取图像
    img_src=cv2.imread(img_path)
    img=cv2.resize(src=img_src,dsize=(500,500))
    #获取卷积核
    kernel=cv2.getStructuringElement(shape=cv2.MORPH_RECT,ksize=(7,7))
    #首先进行腐蚀操作
    img_erode=cv2.erode(src=img,kernel=kernel,iterations=2)
    #再进行膨胀操作
    img_dilate=cv2.dilate(src=img_erode,kernel=kernel,iterations=2)
    #显示图像
    cv2.imshow('img_src',img_src)
    cv2.imshow('img_dilate',img_dilate)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == '__main__':
    print('Pycharm')
    # ProduceWhiteNoise()
    # MorphologyExAnd()
    Erode_Dilate()

直接调用开运算操作的结果
Opencv中的开运算和闭运算操作讲解(python实现)
使用:腐蚀+膨胀方式
Opencv中的开运算和闭运算操作讲解(python实现)
可以看到两者的效果都是很不错的。


3.闭运算

闭运算=膨胀+腐蚀
(和开运算相反)
达到的效果:
比如下面一张图中,可以看到其中有很多的黑色噪点,所以这个时候可以使用开运算操作。

Opencv中的开运算和闭运算操作讲解(python实现)

(1)函数讲解

和开运算一样的函数,只不过op的方式改为:cv2.MORPH_CLOSE

(2)代码实战

import os
import cv2
import random
import numpy as np

#产生黑色噪点
def ProduceBlackNoise(img_path='images/Exen.png'):
    image=cv2.imread(img_path)
    h,w,c=np.shape(image)
    noise=np.zeros(shape=image.shape,dtype=np.uint8)
    # print(np.shape(image))
    #固定产生白噪点的个数
    count=0
    prob=0.95
    for i in range(h):
        for j in range(w):
            sand=random.random()
            if count<=50000 and sand>prob:
                noise[i][j]=0
                count+=1
            else:
                noise[i][j]=image[i][j]
    cv2.imshow('image',noise)
    cv2.waitKey(0)
    cv2.imwrite('images/Exen_black.png',noise)

#进行开运算的方式一,直接调用开运算函数
def MorphologyExAnd(img_path='images/Exen_black.png'):
    #读取图片
    img_src=cv2.imread(img_path)
    img=cv2.resize(src=img_src,dsize=(500,500))
    #获取卷积核,这里使用矩阵的方式
    kernel=cv2.getStructuringElement(shape=cv2.MORPH_RECT,ksize=(3,3))
    #进行闭运算
    img=cv2.morphologyEx(src=img,op=cv2.MORPH_CLOSE,kernel=kernel,iterations=1)
    #显示图片
    cv2.imshow('img_src',img_src)
    cv2.imshow('img',img)
    #等待接收鼠标或者键值
    cv2.waitKey(0)
    cv2.destroyAllWindows()

#进行开运算方式2=腐蚀+膨胀
def Erode_Dilate(img_path='images/Exen_black.png'):
    #读取图像
    img_src=cv2.imread(img_path)
    img=cv2.resize(src=img_src,dsize=(500,500))
    #获取卷积核
    kernel=cv2.getStructuringElement(shape=cv2.MORPH_RECT,ksize=(3,3))
    #首先进行膨胀操作
    img_dilate = cv2.dilate(src=img, kernel=kernel, iterations=1)
    #再进行腐蚀操作
    img_erode = cv2.erode(src=img_dilate, kernel=kernel, iterations=1)
    #显示图像
    cv2.imshow('img_src',img_src)
    cv2.imshow('img_dilate',img_erode)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == '__main__':
    print('Pycharm')
    # ProduceBlackNoise()
    # MorphologyExAnd()
    Erode_Dilate()

直接使用闭运算函数的结果:
Opencv中的开运算和闭运算操作讲解(python实现)
使用:膨胀+腐蚀方式
Opencv中的开运算和闭运算操作讲解(python实现)
总结:
开运算是解决黑色图像部分中的白色噪点;
闭运算解决的是白色图像部分中的黑色噪点。
文章来源地址https://www.toymoban.com/news/detail-465109.html

到了这里,关于Opencv中的开运算和闭运算操作讲解(python实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • python中的运算符号含义,python基本运算符的操作

    本篇文章给大家谈谈python的运算符号有哪些类型,以及python各运算符号的功能说明,希望对各位有所帮助,不要忘了收藏本站喔。 1.算数运算符(最常见的)     标准算数运算符(加减乘除)     取余运算符     幂运算符 2.赋值运算符 3.比较运算符 4.布尔运算符 5.位运算符

    2024年02月13日
    浏览(45)
  • 形态学 - 开运算和闭运算

    目录 1. 介绍 2. 代码实现  2.1 开运算 2.2 闭运算 膨胀和腐蚀操作都会有一个通病,就是会改变原目标的大小 开运算:先对目标腐蚀在膨胀 开运算能够 平滑物体的轮廓、断开狭窄的狭颈、消除细长的突出物 等等 开运算的一些理解:先腐蚀在膨胀࿰

    2024年02月05日
    浏览(24)
  • 机器视觉之开运算和闭运算

    开运算(Opening)和闭运算(Closing)是数学形态学中常用的图像处理操作,通常用于去除图像中的噪声、连接物体、分离物体等操作。它们分别由两个基本操作组成:腐蚀(Erosion)和膨胀(Dilation)。 开运算(Opening) : 开运算是先对图像进行腐蚀操作,然后再进行膨胀操作

    2024年02月10日
    浏览(21)
  • OpenCV-Python中的图像基础操作

    首先读入一副图像: 获取像素值及修改的更好方法: img = cv2.imread(‘./resource/image/1.jpg’, cv2.IMREAD_COLOR) img.shape: 图像的形状(包括行数,列数,通道数的元组) img.size : 图像的像素数目 img.dtype :图像的数据类型 ROI(regionofinterest),感兴趣区域。机器视觉、图像处理中,从被

    2024年02月11日
    浏览(28)
  • 基于python+opencv+mediapipe实现手势识别详细讲解

    目录 运行环境: 一、opencv 二、meidapipe配置 三、实现手部的识别并标注 1、参数分析 1.multi_hand_landmarks  2.multi_hand_world_landmarks 3.multi_handedness 2.绘制信息点和连线 python3.9.7  opencv-python4.6.0.66  mediapipe0.8.11 运行之前先要安装opencv-python、opencv-contrib-python、mediapipe 项目可能对版本的

    2024年01月25日
    浏览(36)
  • 【OpenCv • c++】形态学技术操作 —— 开运算与闭运算

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪 在上一篇文章中,我

    2024年02月05日
    浏览(33)
  • Opencv | 基于像素的基础操作 & 逻辑运算

    感谢阅读🌼 如果喜欢这篇文章,记得点赞👍和转发🔄哦! 有任何想法或问题,欢迎留言交流💬,我们下次见! 本文相关代码存放位置     【 Opencv基于像素值的计算 】     【 Opencv 基于像素值的逻辑运算 】 祝愉快🌟!

    2024年04月12日
    浏览(23)
  • MySQL数据表:对数据的基础操作(增、删、查、改)以及运算符的讲解

    目录 前言 一.增加数据 二.查询数据 2.1查询数据表中所有信息  2.2查询表中指定的列信息  2.3查询通过计算的列  2.4使用别名代替列名  2.5查询不带有重复值的列 2.6将查询的结果进行排序  2.7条件查询        2.7.1条件查询的种类               2.7.2使用运算符查询的讲解

    2024年02月09日
    浏览(35)
  • 【CV 向】了解 OpenCV 中的算术与位运算

    Python OpenCV 是一个功能强大的计算机视觉库,用于图像处理和计算机视觉任务。在 OpenCV 中,我们可以使用 NumPy 库创建图像,并应用算术和位运算来实现图像的增强、特效处理和图像融合等操作。本文将介绍如何利用 NumPy 创建图像,并展示如何使用 Python OpenCV 进行算术与位运

    2024年02月09日
    浏览(34)
  • 在arm版ubuntu上编译安装c++版本opencv和闭坑指南

    目录 一、安装 1、安装依赖: 2、编译安装ffmpeg (1)下载源码并解压; (2)指定编译链和路径: (3)编译安装 3、编译安装opencv (1)下载源码并解压 (2)配置 (3)编译并安装 二、坑列表 1、编译opencv报错  c++: internal compiler error: Killed (program cc1plus) 2、解决ffmpeg执行报错

    2024年02月12日
    浏览(26)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包