当前位置: 首页 > java >正文

Opencv 形态学与梯度运算

形态学梯度运算

1.腐蚀操作

import numpy as np
kernel = np.ones((3,3),np.uint8)
erosion=cv2.erode(img,kernel,iterations=3) ##注意腐蚀操作是白色变为黑色,因为白色值为255,黑色为0,是数值变小,注意和膨胀区分
cv2.imshow('erosion',erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.膨胀操作

kernel = np.ones((3,3),np.uint8)
dilate = cv2.dilate(img,kernel,iterations=1)
cv2.imshow('dilate',dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.开运算

# 开运算:先腐蚀,再膨胀
img=cv2.imread(r'C:\learn\MarkDown\anconda\fushi.png')
kernel=np.ones((5,5),np.uint8)
opening=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
cv2.imshow('opening',opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.闭运算

# 闭:先膨胀,再腐蚀
img=cv2.imread(r'C:\learn\MarkDown\anconda\fushi.png')
kernel=np.ones((5,5),np.uint8)
opening=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
cv2.imshow('opening',opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

5. 礼貌操作

### 礼帽=原始图像-开运算结果(先腐蚀再膨胀) 原始图像(带毛刺的)-(先腐蚀再膨胀之后的没毛刺了) 所以只剩下毛刺了
### 黑帽=闭运算 -原始图像
import cv2
import numpy as np
img=cv2.imread(r'C:\learn\MarkDown\anconda\fushi.png')
kernel=np.ones((5,5),np.uint8)
tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
cv2.imshow('top',tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

6.黑帽操作

#黑帽操作=闭运算-原始输入(闭运算先膨胀再腐蚀(有刺)-原始图像(有刺)=剩下的原始图像的轮廓(没刺))
img=cv2.imread(r'C:\learn\MarkDown\anconda\fushi.png')
blackhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow('blackhat',blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()

7.图像梯度Sobel算子(类似于高斯函数形式)

在这里插入图片描述

dst=cv2.Sobel(src,depth,dx,dy,ksize)

  • deppth:图像深度
  • dx和dy水平和竖直方向
  • ksize是Sobel算子的大小
def cv_show(name,img): # 定义函数加:cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()
# 水平方向 是右边-左边(由于圆图的左半部分右边是白色减去黑色就是左半边缘,右半部分黑色-白色是负值所以还是黑色)
sobelX = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
cv_show('img',sobelX)

白到黑是正数,黑到白就是负数了,所有负数都会被截断为0,所以要取绝对值

# 计算水平方向
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx=cv2.convertScaleAbs(sobelx)
cv_show('sobelx',sobelx)
#计算竖直方向
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely=cv2.convertScaleAbs(sobely)
cv_show('sobely',sobely)
#进行x和y方向的求和
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show('sobelxy',sobelxy)

OpenCv中不建议建议直接使用Gx和Gy一起使用

sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3) #不建议这么使用,弃用
cv_show('sobelxy',sobelxy) 

整体使用lena图片操作使用sobel算子计算边缘

img=cv2.imread(r'C:\learn\MarkDown\anconda\lena.png',cv2.IMREAD_GRAYSCALE)
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx=cv2.convertScaleAbs(sobelx)
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely=cv2.convertScaleAbs(sobely)
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show('sobelxy',sobelxy)

8. Scharry 算子和Laplacian算子

在这里插入图片描述

三种算子比较 Scharr算子(相对于sobel算子上下,左右方向差值更大,计算的结果差值更明显)更能捕捉到梯度的细节,laplcaian算子相当于二阶导(相当于变化率),对于噪音点也更敏感。

import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread(r'C:\learn\MarkDown\anconda\lena.png',cv2.IMREAD_GRAYSCALE)
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx=cv2.convertScaleAbs(sobelx)
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely=cv2.convertScaleAbs(sobely)
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)#img=cv2.imread(r'C:\learn\MarkDown\anconda\lena.png',cv2.IMREAD_GRAYSCALE)
Scharrx=cv2.Scharr(img,cv2.CV_64F,1,0)
Scharrx=cv2.convertScaleAbs(Scharrx)
Scharry=cv2.Scharr(img,cv2.CV_64F,0,1)
Scharry=cv2.convertScaleAbs(Scharry)
Scharrxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)laplacian=cv2.Laplacian(img,cv2.CV_64F)
Laplacian=cv2.convertScaleAbs(laplacian)res=np.hstack((sobelxy,Scharrxy,Laplacian))
cv_show('res',res)

在这里插入图片描述

http://www.xdnf.cn/news/18051.html

相关文章:

  • C++ 标准模板库 (^^ゞ 致敬 STL 创始人 Alexander Stepanov
  • React 第七十节 Router中matchRoutes的使用详解及注意事项
  • 【完整源码+数据集+部署教程】胃部病变检测系统源码和数据集:改进yolo11-LSKNet
  • wgs-84坐标到直角坐标系
  • Git 命令指南:从 0 到熟练、从常用到“几乎全集”(含常见报错与解决)建议收藏!!!
  • 大上墨水屏显示器Paperlike253 Mac 特别版 使用体会
  • Git登录配置的详细方法
  • uniapp中uni.showToast和 uni.showLoading同时使用时出现提示中断冲突问题。
  • java设计模式之迪米特法则使用场景分析
  • 佳文赏读 || (CVPR 2025新突破) Robobrain:机器人操作从抽象到具体的统一大脑模型(A Unified Brain Model)
  • 魔搭api功能优化
  • 栈与队列:数据结构中的双生子
  • 【P14 3-6 】OpenCV Python——视频加载、摄像头调用、视频基本信息获取(宽、高、帧率、总帧数),视频保存在指定位置
  • 在职老D渗透日记day18:sqli-labs靶场通关(第26关)get报错注入 过滤or和and基础上又过滤了空格和注释符 ‘闭合 手动注入
  • qt vs2019编译QXlsx
  • Linux软件编程(六)(exec 函数族、system 实现、进程回收与线程通信)
  • C++ 内存管理(内存分布 , 管理方式 , new和delete实现原理)
  • pidgen!DecodeProdKey函数分析之iDecodedBytesMax
  • 服务器硬件电路设计之I2C问答(七):解析 I2C 通信 “卡壳” 难题:从设备无响应与跨电压兼容之道
  • Spring AI Starter和文档解读
  • InfluxDB 数据迁移工具:跨数据库同步方案(一)
  • 超酷炫的Three.js示例
  • Java:File类、递归、字符集、IO流体系及Commons-io框架
  • 【大模型核心技术】Dify 入门教程
  • Flow-GRPO:通过在线 RL 训练 Flow matching 模型
  • PS插件整合包!内置数百款PS插件,支持PS2017-PS2025所有版本!
  • 【学习嵌入式day-26-线程间通信】
  • TypeScript快速入门
  • CPP多线程3:async和future、promise
  • ArrayList的contains问题