首页 > 其他分享 >OpenCV 形态学操作

OpenCV 形态学操作

时间:2024-06-15 21:30:11浏览次数:10  
标签:kernel img dst cv2 形态学 OpenCV import np 操作

canny边缘检测

        canny边缘检测算法是John F.Canny于1986年开发出来的一个多边缘检测算法,也被很多人认为是边缘检测的最优算法,最优边缘检测的三个主要标准是:
        低错误率:标识出尽可能多的实际边缘,同时尽可能的减少噪声产生的误报。
        高定位性:标识出的边缘要与图像中的实际边缘尽可能接近。
        最小响应:图像中的边缘只能标注一次。

Canny边缘检测的一般步骤:
        去噪:边缘检测容易受到噪声影响,在进行边缘检测前通常需要先进行去噪,一般用高斯滤波去除噪声。
        计算梯度:对平滑后的图像采用sobel算子计算梯度和方向。
        非极大值抑制:在获取了梯度和方向后,遍历图像,去除所有不是边界的点。
                实现方法:逐个遍历像素点,判断当前像素点是否是周围像素点中具有相同方向梯度的最大值。如果是,保留该点;否则,它被抑制。

import cv2
import numpy as np

img = cv2.imread('./dog.jpg')

#cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])
dog1=cv2.Canny(img,100,200)
dog2=cv2.Canny(img,110,210)
dog3=cv2.Canny(img,130,150)


cv2.imshow('img',img)
cv2.imshow('dog',np.vstack((dog1,dog2,dog3)))
cv2.waitKey(0)
cv2.destroyAllWindows()

查找轮廓

图像轮廓是具有相同颜色或灰度的连续的曲线,轮廓在形状分析和物体检测和识别中很有用。
轮廓的作用:
        用于图形分析
        物体的识别和检测
注意点:
        为了检测的准确性,需要先对图像进行二值化或Canny操作。
        画轮廓时会修改输入图像,如果之后像继续使用原始图像,应该将原始图像储存到其他变量中。

#findContours(image,mode,method[,contours[,hierarchy[,offset]]])

###mode 查找轮廓的方式
#####RETR_EXTERAL=0,表示只检测外围轮廓
#####RETR_LIST=1,检测的轮廓不建立等级关系,即检测所有轮廓,较为常用。
#####RETR_CCOMP=2,每层最多两级,从小到大,从里到外。
#####RETR_TREE=3,按照树型存储轮廓,从大到小,从右到左

###method 轮廓近似方法也叫ApproximationMode
#####CHAIN_APPROX_NONE 保存所有轮廓上的点
#####CHAIN_APPROX_SIMPLE,只保存角点,比如四边形,只保留四边形的4个角,存储信息少,比较常用

###返回contour和hierarchy即轮廓和层级
import cv2
import numpy as np

#读取图片
img=cv2.imread('./cat.jpg')

#变成单通道的黑白图片
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#二值化,注意有两个返回值,阈值和结果
ret,binary=cv2.threshold(gray,160,255,cv2.THRESH_BINARY)

#查找轮廓,新版本返回两个结果,分别是轮廓和层级
contours, hierarchy=cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

# #contour是list 不是ndarry,里面放的是ndarry表示一个contour
# print(type(contours))
# print(contours)
# print(hierarchy)



# cv2.imshow('img',img)
# cv2.imshow('gray',gray)
# cv2.imshow('binary',binary)

cv2.waitKey(0)
cv2.destroyAllWindows()

绘制轮廓

import cv2
import numpy as np

#读取图片
img=cv2.imread('./cat.jpg')

#变成单通道的黑白图片
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#二值化,注意有两个返回值,阈值和结果
ret,binary=cv2.threshold(gray,160,255,cv2.THRESH_BINARY)

#查找轮廓,新版本返回两个结果,分别是轮廓和层级
contours, hierarchy=cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

###########################################################################################
#绘制轮廓会直接修改原图。
#如果想保持原图不变,建议copy一份
#image 要绘制的轮廓图像
#contours 轮廓点
#contourIdx 要绘制的轮廓编号,-1表示绘制所有轮廓
#color 轮廓的颜色,如(0,0,255)表示红色
#thickness线宽,-1表示全填充
img_copy=img.copy()
cv2.drawContours(img_copy,contours,-1,(0,0,255),1)

##########################################################################################

cv2.imshow('img',img)
cv2.imshow('img_copy',img_copy)
# cv2.imshow('gray',gray)
cv2.imshow('binary',binary)

cv2.waitKey(0)
cv2.destroyAllWindows()

腐蚀操作

import cv2
import numpy as np

#导入图片
img=cv2.imread('./big.jpg')
#滤波
filt1=cv2.bilateralFilter(img,21,sigmaColor=50,sigmaSpace=500)

#二值化操作是对灰度图像操作,把dog变成灰度图像。
gray=cv2.cvtColor(filt1,cv2.COLOR_BGR2GRAY)

#滤波
filt12=cv2.bilateralFilter(gray,21,sigmaColor=50,sigmaSpace=500)

#自适应阈值二值化只有一个返回值。
bina=cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,49,0)

#定义核
kernel=np.ones((3,3),np.uint8)
dst=cv2.erode(bina,kernel,iterations=1)


cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.imshow('big2',np.vstack((gray,bina)))
cv2.waitKey(0)
cv2.destroyAllWindows()

获取形态学卷积核

opencv提供了获取卷积核的api,不需要我们手工创建卷积核。

#getStructuringElement(shape,ksize[,anchor])
###shape是指卷积核的形状,注意不是指长宽,是指卷积核中1形成的形状。
#####MORPH_RECT卷积核中的1是矩形,常用。
#####MORPH_ELLIPSE 椭圆
#####MORPH_CROSS 十字
import cv2
import numpy as np

###################获取卷积核###########################
#矩形
#kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

#椭圆
#kernel=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))

#十字
kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))

print(kernel)

########################################################

#导入图片
img=cv2.imread('./big.jpg')

#变成灰度图像。
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#自适应阈值二值化只有一个返回值。
bina=cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,49,0)

#腐蚀
dst=cv2.erode(bina,kernel,iterations=1)

cv2.imshow('dst',dst)
cv2.imshow('big2',np.vstack((gray,bina)))
cv2.waitKey(0)
cv2.destroyAllWindows()

开运算和闭运算

开运算

##################################################################################################
#开运算和闭运算都是腐蚀和膨胀的基本应用
#开运算=腐蚀+膨胀
#morphologyEx(img,MORPH_OPEN,kernel)
###MORPH_OPEN 表示形态学的开运算
###kernel 如果噪点比较多,会选择大一点的kernel,如果噪点比较小,可以选择小点的kernel。
##################################################################################################
import cv2
import numpy as np

#开运算=腐蚀+膨胀
#开运算提供了另一种去除噪声的思路
img=cv2.imread('./xhx.jpg')
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))

# #先腐蚀
# 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()

闭运算

#闭运算=膨胀+腐蚀
import cv2
import numpy as np

#开运算=腐蚀+膨胀
#闭运算可以去除图形内部的噪声
img=cv2.imread('./xh.jpg')
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))

#调用opencv提供的api
dst=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel,iterations=2)

cv2.imshow('img',np.hstack((img,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

膨胀操作

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

import cv2
import numpy as np

#导入图片
img=cv2.imread('./xhx.jpg')

#获取卷积核
kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))

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

cv2.imshow('big2',np.vstack((img,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

形态学梯度和顶帽黑帽操作

梯度=原图-腐蚀

#腐蚀之后原图边缘变小了,原图-腐蚀就可以得到腐蚀掉的部分,即边缘
import cv2
import numpy as np

img=cv2.imread('./xh.jpg')
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))


#调用opencv提供的api
dst=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel,iterations=1)



cv2.imshow('img',np.hstack((img,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

顶帽=原图-开运算

#开运算的效果是去除图像外的噪点,原图-开运算就得到了去掉的噪点。
import cv2
import numpy as np

img=cv2.imread('./xh.jpg')
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))


#调用opencv提供的api
dst=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel,iterations=3)



cv2.imshow('img',np.hstack((img,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

黑帽=原图-闭运算

#闭运算可以将图形内部的噪点去掉,那么原图-闭运算的结果就是图形内部的噪点
import cv2
import numpy as np

img=cv2.imread('./xh.jpg')
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))


#调用opencv提供的api
dst=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel,iterations=3)



cv2.imshow('img',np.hstack((img,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

标签:kernel,img,dst,cv2,形态学,OpenCV,import,np,操作
From: https://blog.csdn.net/m0_66464341/article/details/139707948

相关文章

  • Linux vim 文本编辑 操作文本 三种模式
    介绍vi是一个经典的行编辑器,支持模式编辑(包括普通模式、插入模式和命令模式)。vim保留vi核心功能的基础上,增加了多级撤销、语法高亮、插件支持等高级功能。两者的最大区别,简单的来说vim就是vi的增强版三种模式命令模式(CommandMode)默认进入的是命令模式。在这个模式......
  • CLFS驱动程序(clfs.sys)是Windows操作系统中的一个组件,它提供了日志记录和恢复功能,以增
    clfs.sys是Windows操作系统中的一个系统文件,它是CLFS(CommonLogFileSystem)驱动程序的一部分。CLFS是Windows操作系统中用于管理日志文件的文件系统,它提供了日志记录和恢复功能。CLFS驱动程序(clfs.sys)具有以下功能和作用:日志记录:CLFS可以记录系统的操作、事件和错误等信息到......
  • Makefile手册中"+=",":=","?="操作符的区别
    目录Makefile手册中"+=",":=","?="操作符的区别1."?="操作符2."+="操作符3.":="操作符Makefile手册中"+=",":=","?="操作符的区别1."?="操作符在GNUmake中,有一个变量在之前没有被赋值的情况下才会对这个变量进行赋值的操作,被称为条件赋值操作......
  • 原子操作 CAS
    假定有两个操作A和B,如果从执行A的线程来看,当另一个线程执行B时,要么将B全部执行完,要么完全不执行B,那么A和B对彼此来说是原子的。synchronized关键字是基于阻塞的锁机制,也就是说当一个线程拥有锁的时候,访问同一资源的其它线程需要等待,直到该线程释放锁CAS操作如......
  • tms和海外仓操作系统:区别是什么,都有那些选择,价格怎样
    对于从事跨境仓储物流行业的人来说,tms系统和海外仓操作系统这两个工具应该还是不陌生的。不过对一些小型的海外仓物流企业来说,到底是应该选择tms系统还是海外仓操作系统?两者的区别是什么,该怎么选择,什么价格合适呢?今天我们就用一篇文章,系统的帮大家理清楚tms系统和海外仓操作系......
  • 台球室用的开关灯系统,佳易王桌球灯控计费系统操作教程
    台球室用的开关灯系统,佳易王桌球灯控计费系统操作教程一、前言以下软件操作教程以,佳易王台球开关灯控管理软件为例说明软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载软件操作教程1、开关灯参数设置:系统设置——端口设置灯控器使用usb转串口线与电......
  • 006-使用buildroot构建一个完整的Linux操作系统
    原文:https://www.bilibili.com/read/cv31634226/实验介绍 之前的实验中介绍了如何使用buildroot构建一个易于使用的完整文件系统,但是buildroot的功能不止于此。 本实验准备使用buildroot构建一个完整的Linux操作系统。 本实验还会将编译好的固件烧录到U盘中,然后在......
  • officegen操作word文档和xlsx表格
    officegen操作word文档constofficegen=require('officegen')constfs=require('fs')//创建一个空的Word对象:letdocx=officegen('docx')//Officegen在完成生成docx文档后调用此函数:docx.on('finalize',function(written){console.log(......
  • 基于Python+OpenCV的车牌识别停车场管理系统(PyQt界面)【含Python源码 MX_009期】
    简介:        基于Python和OpenCV的车牌识别停车场管理系统是一种利用计算机视觉技术来自动识别停车场进出车辆的系统。该系统通过摄像头捕获车辆图像,并使用OpenCV库中的图像处理和模式识别技术来识别图像中的车牌号码。一旦车牌被成功识别,系统就会将车辆的进出时间和......
  • 从零手写实现 nginx-23-nginx 对于 cookie 的操作
    前言大家好,我是老马。很高兴遇到你。我们为java开发者实现了java版本的nginxhttps://github.com/houbb/nginx4j如果你想知道servlet如何处理的,可以参考我的另一个项目:手写从零实现简易版tomcatminicat手写nginx系列如果你对nginx原理感兴趣,可以阅读:从零......