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

Python OpenCV形态学处理和图像梯度

形态转换

形态学变换是基于图像形状的一些简单操作。它通常在二值图像上执行。它需要两个输入,一个是我们的原始图像,第二个是决定操作性质的结构元素或内核。两个基本的形态学操作是腐蚀和膨胀。

腐蚀

腐蚀的基本概念就像土壤侵蚀一样,只侵蚀前景对象的边界(总是尽量保持前景为白色)。

那它有什么作用呢?

内核在图像中滑动(如二维卷积)。只有当内核下的所有像素都为 1 时,原始图像中的像素(1 或 0)才会被视为 1,否则会被侵蚀(变为零)。

所以根据内核的大小,边界附近的所有像素都将被丢弃。因此,前景对象的厚度或大小在图像中减少或只是白色区域减少。它有助于消除小的白色噪音(如我们在“颜色空间”一章中所看到的),分离两个连接的对象等。

在这里插入图片描述

import cv2
import numpy as np# 读取二值图像
image = cv2.imread('binary_image.jpg', 0)# 创建5x5的结构元素(内核)
kernel = np.ones((5, 5), np.uint8)# 执行腐蚀操作
eroded_image = cv2.erode(image, kernel, iterations=1)# 显示原始图像和腐蚀后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Eroded Image', eroded_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
膨胀

膨胀与腐蚀正好相反。这里,如果内核下至少有一个像素为“1”,则像素元素为“1”。所以它会增加图像中的白色区域,或者增加前景对象的大小。

通常情况下,在去除噪音的情况下,腐蚀后会膨胀。因为,腐蚀消除了白噪声,但它也缩小了我们的对象。所以我们扩大它。由于噪音消失了,它们不会再回来,但我们的目标区域会增加到腐蚀之前的状态。它还可用于连接对象的断开部分。

在这里插入图片描述

# 执行膨胀操作
dilated_image = cv2.dilate(image, kernel, iterations=1)# 显示膨胀后的图像
cv2.imshow('Dilated Image', dilated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
开运算–先腐蚀再膨胀

开运算一般会平滑物体的轮廓、断开较窄的狭颈并消除细的突出物。正如我们上面所解释的,它对消除噪音很有用。在这里,我们使用 cv.morphologyEx()

# 执行开运算
opened_image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)# 显示开运算后的图像
cv2.imshow('Opened Image', opened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
闭运算–先膨胀再腐蚀

闭运算同样也会平滑轮廓的一部分。但与开操作相反,它通常会弥合较窄的间断和细长的沟壑,消除小的孔洞填补轮廓线中的断裂

# 执行闭运算
closed_image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)# 显示闭运算后的图像
cv2.imshow('Closed Image', closed_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
顶帽运算–原始减去开运算

在这里插入图片描述

黑帽运算–闭运算减去原始

在这里插入图片描述

  • 腐蚀:cv2.erode(src, kernel, iterations) #iterations表示腐蚀几次

  • 膨胀:cv2.dilate(src, kernel, iterations)

  • 开运算:cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)

  • 闭运算:cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)

图像梯度

OpenCv 提供三种类型的梯度滤波器或高通滤波器,Sobel、Scharr 和 Laplacian。

sobel算子

Sobel 算子是一种边缘检测算子,它结合了高斯平滑与微分运算,从而提高了对噪声的抵抗力。Sobel 算子通过两个方向(水平和垂直)来计算图像的梯度。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
计算图像的总梯度(两个方向上)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • dst = cv2.Sobel(src, ddepth, dx, dy, [ksize])
    • dst:计算结果
    • src:原始图像
    • ddepth :处理结果图像深度
    • dx:x轴方向
    • dy:y轴方向
    • ksize:核大小

ddepth参数说明:

  • 一般,通常直接设置为-1,表示让处理结果与原始图像保持一致
  • 但是此处需要注意,不能直接置为-1

dx dy参数说明:

  • 计算x方向梯度: dx=1,dy=0

  • 计算y方向梯度:dx=0,dy=1

在这里插入图片描述
opencv提供了一个计算两幅图像的权重和

dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)
五个参数分别表示:原图像1,原图像1的系数,原图像2,原图像2的系数,修正值
在这里插入图片描述

示例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

scharr算子

Scharr 算子是 Sobel 算子的一个变种,具有更好的旋转不变性和更高的梯度响应。Scharr 算子在某些情况下能够提供更精确的边缘检测,尤其是细节较多的图像。
在这里插入图片描述

dst = Scharr(src, ddpeth, dx, dy)

  • src:原始图像
  • ddepth:处理结果图像深度
  • dx:x轴方向
  • dy:y轴方向

ddepth参数:一般在别的图像处理函数中,直接置为-1,表示处理成与原图像一样深度的图像,但是由于此函数处理过程中会出现负数,故与sobel算子一样,将它赋值为cv2.CV_64F

然后再转为unit8正数

dst = Scharr(src, cv2.CV_64F, dx, dy)dst = cv2.convertScaleAbs(dst)

在这里插入图片描述

sobel和 scharr算子大小是一样的,说明计算起来的工作量是一样的;但是scharr精确度更高,给了临近像素更高的权重
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import cv2
import numpy as np# 读取图像并转换为灰度图
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# Sobel 微分
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)  # X方向
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)  # Y方向
sobel_magnitude = cv2.magnitude(sobel_x, sobel_y)  # 计算梯度幅值# Scharr 微分
scharr_x = cv2.Scharr(image, cv2.CV_64F, 1, 0)  # X方向
scharr_y = cv2.Scharr(image, cv2.CV_64F, 0, 1)  # Y方向
scharr_magnitude = cv2.magnitude(scharr_x, scharr_y)  # 计算梯度幅值# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Sobel Magnitude', sobel_magnitude)
cv2.imshow('Scharr Magnitude', scharr_magnitude)
cv2.waitKey(0)
cv2.destroyAllWindows()
laplacian算子

拉普拉斯算子类似于二阶sobel导数。实际上,在OpenCV中通过调用sobel算子来计算拉普拉斯算子。

公式:
在这里插入图片描述
卷积核:
在这里插入图片描述
示例:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

函数实现:

  • dst = cv2.Laplacian(src, ddepth)

注意:通常情况下,可以将图像深度ddepth的值设置为-1,让处理结果与原始图像保持一致

但是该函数在计算过程中也会出现负数
在这里插入图片描述

import cv2
import numpy as np
o = cv2.imread('image\\laplacian.bmp', cv2.IMREAD_GRAYSCALE)laplacian = cv2.Laplacian(o, cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)  #转回uint8cv2.imshow('original', o)
cv2.imshow('laplacian', laplacian)
cv2.waitKey()
cv2.destoryAllWindows()

http://www.mrgr.cn/news/65438.html

相关文章:

  • hivt实战
  • VB中的代码重构(Code Refactoring)实践及其好处。
  • Java-I/O框架09:InputStreamReader、OutputStreamWriter使用
  • Python小白学习教程从入门到入坑------第二十四课 继承(语法进阶)
  • Android编译环境构建(二)(可用于物理机、虚拟机、容器化Jenkins环境)
  • CSS网格布局
  • 【计算机方向】中科院一区TOP顶刊,国人发文量友好、IF:13.8,晋升神刊!
  • ValueError: set_wakeup_fd only works in main thread
  • uniapp 使用vue/pwa
  • mfc | mfc集成opencv,实现摄像头监控、拍照、视频图像处理(亮度、对比度、色调、饱和度)功能
  • 我们来学mysql -- 同时使用 AND 和 OR 查询错误(填坑篇)
  • openvino python推理demo
  • 年轻消费者动销方案:精准触达,嗨翻潮流
  • Win/Linux/Kylin 系统安装指定版本 jdk(8u171为例)
  • springboot 基于web的动漫会员购系统,计算机毕业设计项目源码 024,计算机毕设程序(LW+开题报告、中期报告、任务书等全套方案)
  • 麦麦Docker笔记(一)
  • 对象数组按照非升序或降序的既定顺序排序
  • 大数据导论及分布式存储HadoopHDFS入门
  • 掌声响起来——不确定性人工智能与高斯云方法的应用
  • 深入Pillow:处理图像下载中的意外挑战
  • STM32:IIC详解
  • 【C++类和对象篇】类和对象的六大默认成员函数——构造,析构,拷贝构造,赋值重载,普通对象取地址重载,const对象取地址重载
  • Aurora 64b/66bIP核学习
  • 开发者的黄金时代:原生鸿蒙应用市场的全生命周期服务
  • 2024版红娘金媒10.3婚恋相亲系统源码小程序(亲测)
  • transformers 框架使用详解,bert-base-chinese