首页 > 其他分享 >OpenCV 开闭操作

OpenCV 开闭操作

时间:2024-08-11 10:54:51浏览次数:17  
标签:binary imshow gray image MORPH 开闭 OpenCV 操作 cv

目录

一:开操作(先腐蚀后膨胀)
   特点:消除噪点,去除小的干扰块,而不影响原来的图像
二:闭操作(先膨胀后腐蚀)
   特点:可以填充闭合区域
三:利用开操作完成的任务
  (一)提取水平垂直线
  原理:
  (二)消除干扰线
  (三)提取满足要求的形状
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一:开操作(先腐蚀后膨胀)
特点:消除噪点,去除小的干扰块,而不影响原来的图像

import cv2 as cv
import numpy as np

def camp(val1,val2):
    pv = val1 + val2
    if pv > 255:
        return 255
    if pv < 0:
        return 0
    return pv

def open_demo(image):
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    for i in range(1000):  #为灰度图像加一些噪点
        h = np.random.random_integers(0,gray.shape[0]-1)
        w = np.random.random_integers(0, gray.shape[1]-1)
        val = np.random.random_integers(0, 255)
        gray[h,w] = camp(gray[h,w],val)

    ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)  #生成二值化图像
    cv.imshow("binary",binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))
    binary = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)  #开操作,先腐蚀后膨胀,会消除一些为1的白色噪点
    cv.imshow("open_demo",binary)


src = cv.imread("./o.png")  #读取图片
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)    #创建GUI窗口,形式为自适应
cv.imshow("input image",src)    #通过名字将图像和窗口联系

open_demo(src)

cv.waitKey(0)   #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
cv.destroyAllWindows()  #销毁所有窗口

在这里插入图片描述

二:闭操作(先膨胀后腐蚀)
特点:可以填充闭合区域

def close_demo(image):
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
    cv.imshow("binary",binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,15))
    binary = cv.morphologyEx(binary,cv.MORPH_CLOSE,kernel)
    cv.imshow("close_demo",binary)


src = cv.imread("./o.png")  #读取图片
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)    #创建GUI窗口,形式为自适应
cv.imshow("input image",src)    #通过名字将图像和窗口联系 

在这里插入图片描述

三:利用开操作完成的任务
(一)提取水平垂直线

def open_demo(image):
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)
    cv.imshow("binary",binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(1,15))  #修改内核为(15,1)可以提起横线
    binary = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)
    cv.imshow("open_demo",binary)

在这里插入图片描述
原理:
在这里插入图片描述
在这里插入图片描述

kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,1))

在这里插入图片描述

(二)消除干扰线

def open_demo(image):
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)
    cv.imshow("binary",binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))  #因为干扰线很细,小于我们想要的字母,先腐蚀后膨胀对字母无影响,但是对于细线在腐蚀的时候就处理掉了
    binary = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)
    cv.imshow("open_demo",binary)

在这里插入图片描述

(三)提取满足要求的形状
getStructuringElement我们设置的内核形状为矩形,是可以设置其他形状
矩形:MORPH_RECT;
交叉形:MORPH_CORSS;
椭圆形:MORPH_ELLIPSE;
参考:OpenCV—膨胀与腐蚀

def open_demo(image):
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
    cv.imshow("binary",binary)
    kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
    binary = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)
    cv.imshow("open_demo",binary)

在这里插入图片描述

标签:binary,imshow,gray,image,MORPH,开闭,OpenCV,操作,cv
From: https://blog.csdn.net/m0_37302966/article/details/141087392

相关文章

  • 利用OpenCvSharp进行图像相关操作
    前言程序设计过程,有时也需要对图像进行一些简单操作,C#没有现成的图像处理库,但有人对OpenCV进行了包装,我们可以很方便的使用OpenCvSharp对图像进行操作。当然了,这也需要使用的人员进行一些研究,但相对于C++版本,它已经非常友好了。1、显示图像代码:privatevoidbutton1_Click(......
  • [图文直播]Windows操作系统部署Jenkins
    前言首先说明一下我为什么选择在Windows操作系统上部署Jenkins是吧,主要基于虽然从长远上看,我是有进行跨平台开发的需求,但至少在可预见的三到五年时间内,我的潜在客户也都是在windows操作系统上。至于跨平台,规划上要有,但正如天龙八部里天龙寺内面对鸠摩智打算拿拈花指、无相劫指......
  • 4.3.3 OpenCV 实现 高斯金字塔和拉普拉斯金字塔
    4.3.3OpenCV实现高斯金字塔和拉普拉斯金字塔参考教程:图像处理中的高斯金字塔和拉普拉斯金字塔_拉普拉斯金字塔插入偶数行,偶数列也是用卷积算法吗-CSDN博客1.安装OpenCV1.1下载OpenCV参考教程:无法定位软件包libjasper-dev的解决办法-CSDN博客视觉slam14讲ch5opencv......
  • CUDA--内存访问越界或无效的索引操作解决办法
    报错信息File"D:\anaconda3\envs\HCAVE2\lib\site-packages\torch\nn\utils\rnn.py",line258,inpack_padded_sequencesorted_indices=sorted_indices.to(input.device)RuntimeError:CUDAerror:device-sideasserttriggeredCUDAkernelerrorsm......
  • CUDA--内存访问越界或无效的索引操作解决办法--总结
    设备端的断言错误(device-sideasserttriggered)通常发生在CUDA代码中访问无效的内存地址或执行了无效的操作。解决这种错误需要系统地排查代码中的潜在问题。以下是详细的解决方案:1.检查数组边界确保所有访问数组或指针的操作都在有效范围内。检查线程索引和块索引的计算,确......
  • 【时时三省】(C语言基础)操作符3
    山不在高,有仙则名。水不在深,有龙则灵。             ----CSDN时时三省&取地址操作符示例: 每个内存单元都有自己的编号编号就成为内存单元的地址&a就是找出a的地址后面可以加一个int*pa=&a是可以用来存放地址pa是用来存放地址的-pa就是一......
  • QT6配置opencv
    参考一个博主的步骤:Qt6MinGW+OpenCV+CMake+Windows11环境搭建详细记录_qt6安装opencv-CSDN博客链接放在这里了QT6默认大家都已经安装好了,没安装的可以去搜索QT6安装的教程1.安装opencv:Releases-OpenCV安装:我安装的opencv默认在C盘,根据自己安装的路径找到opencv目录下......
  • 嵌入式硬件操作接口实现分享
    一、前言以STM32为例,打开网络上下载的例程或者是购买开发板自带的例程,都会发现应用层中会有stm32f10x.h或者stm32f10x_gpio.h,这些文件严格来时属于硬件层的,如果软件层出现这些文件会显得很乱。使用过Linux的童鞋们肯定知道linux系统无法直接操作硬件层,打开linux或者rt_threa......
  • go项目实战之word、pdf、txt操作
    最近在项目开发中,频繁的遇到需要对Docx、PDF、TXT等类型的文本进行操作,而目前这方面有unidoc/unioffice,但这个是非开源的,所以使用起来有诸多不方便。而且也搜了很多资料,但是都太笼统了,不方便使用,所以特写此文章希望能帮助大家解决问题!以下代码都可直接复制粘贴使用DO......
  • opencv图像增强一:传统图像去噪方法整理
    一、简介:在数字图像处理领域,噪声一直是影响图像质量的重要因素。无论是拍摄过程中的环境干扰,还是传输过程中的信号失真,噪声都可能导致图像模糊、细节丢失,甚至影响后续的图像分析和应用。为了提高图像的视觉效果和使用价值,图像去噪技术应运而生,成为图像预处理环节中不可或缺......