#coding:utf-8
import SimpleITK as sitk
import numpy as np
import cv2
# 膨胀
def dilateion(image):
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
# dilate = cv2.dilate(image, kernel, iterations=1)
dilate = cv2.morphologyEx(image, cv2.MORPH_DILATE, kernel)
return dilate
def erode(image):
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
# erode = cv2.erode(image, kernel, iterations=1)
erode = cv2.morphologyEx(image, cv2.MORPH_ERODE, kernel)
return erode
# 形态学梯度
def edge(image):
SE = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
img_grad = cv2.morphologyEx(image, cv2.MORPH_GRADIENT, SE)
return img_grad
# 开运算
def openOpreation(image):
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
open = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
return open
# 闭运算
def closeOperation(image):
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
close = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
return close
# 读取3D图像,对每一个slice进行形态学变化
def read_3D(image, model="closeOperation"):
slices = image.shape[0]
result = np.zeros(img_num.shape)
for i in range(slices):
sli = img_num[i:i + 1, ...]
s = sli[0, ...]
if model == "dilateion":
slice = dilateion(s)
elif model =="edge":
slice = edge(s)
elif model == "erode":
slice = erode(s)
elif model == "edge":
slice = edge(s)
elif model == "openOpreation":
slice = openOpreation(s)
elif model == "closeOperation":
slice = closeOperation(s)
result[i, ...] = slice
return result
# 保存图像
def save(x, path):
predict_seg = sitk.GetImageFromArray(x)
sitk.WriteImage(predict_seg, path)
# 读取 nii文件
def read_nii(path):
image = sitk.ReadImage(path)
img_num = sitk.GetArrayFromImage(image)
return img_num
if __name__ == "__main__":
path = r"D:\myProject\HDC_vessel_seg\datasets\nii\image\vessel_12.nii"
imgpath = r"D:\myProject\HDC_vessel_seg\datasets\nii\image\image_12.nii"
img_num = read_nii(path)
img = read_nii(imgpath)
img_num = img_num[10:260,...]
img = img[10:260,...]
result = read_3D(img_num)
name = "closeOperation_"
save(result, path.replace("vessel_12", name + "vessel"))
# save(img_num, path.replace("vessel_12", "pre_vessel"))
# save(img, imgpath.replace("image_12", "pre_image"))

原图
膨胀
腐蚀
形态学梯度
先开后闭
先闭后开
 

图像形态学操作(cv2库实现)的更多相关文章

  1. 【图像处理】OpenCV+Python图像处理入门教程(七)图像形态学操作

    图像形态学主要从图像内提取分量信息,该分量信息通常对表达图像的特征具有重要意义.例如,在车牌号码识别中,能够使用形态学计算其重要特征信息,在进行识别时,只需对这些特征信息运算即可.图像形态学在目标视觉 ...

  2. 机器学习进阶-图像形态学操作-梯度运算 cv2.GRADIENT(梯度运算-膨胀图像-腐蚀后的图像)

    1.op = cv2.GRADIENT 用于梯度运算-膨胀图像-腐蚀后的图像 梯度运算:表示的是将膨胀以后的图像 - 腐蚀后的图像,获得了最终的边缘轮廓 代码: 第一步:读取pie图片 第二步:进行腐 ...

  3. 机器学习进阶-图像形态学操作-开运算与闭运算 1.cv2.morphologyEx(进行各类形态学变化) 2.op=cv2.MORPH_OPEN(先腐蚀后膨胀) 3.op=cv2.MORPH_CLOSE(先膨胀后腐蚀)

    1.cv2.morphologyEx(src, op, kernel) 进行各类形态学的变化 参数说明:src传入的图片,op进行变化的方式, kernel表示方框的大小 2.op =  cv2.MO ...

  4. 机器学习进阶-图像形态学操作-膨胀操作 1.cv2.dilate(进行膨胀操作)

    1.cv2.dilate(src, kernel, iteration) 参数说明: src表示输入的图片, kernel表示方框的大小, iteration表示迭代的次数 膨胀操作原理:存在一个ke ...

  5. 机器学习进阶-图像形态学操作-腐蚀操作 1.cv2.erode(进行腐蚀操作)

    1.cv2.erode(src, kernel, iteration) 参数说明:src表示的是输入图片,kernel表示的是方框的大小,iteration表示迭代的次数 腐蚀操作原理:存在一个ker ...

  6. opencv学习笔记(五)----图像的形态学操作

    图像的形态学操作有基本的腐蚀和膨胀操作和其余扩展形态学变换操作(高级操作)-----开运算,闭运算,礼帽(顶帽)操作,黑帽操作...(主要也是为了去噪声,改善图像) 形态学操作都是用于处理二值图像(其 ...

  7. 【OpenCV-Python】-图像形态学转化

    原文为段立辉翻译,感谢Linux公社此文档为自学转述,如有侵权请联系本人. 目标: • 学习不同的形态学操作,例如腐蚀,膨胀,开运算,闭运算等 • 学习的函数有:cv2.erode(),cv2.dil ...

  8. OpenCV中的图像形态学转换

    两个基本的形态学操作是腐蚀和膨胀.他们的变化构成了开运算,闭运算,梯度等.下面以这张图为例 1.腐蚀 这个操作会把前景物体的边界腐蚀掉. import cv2 import numpy as np i ...

  9. EasyPR--开发详解(4)形态学操作、尺寸验证、旋转等操作

    在上一篇深度分析与调优讨论中,我们介绍了高斯模糊,灰度化和Sobel算子.在本文中,会分析剩余的定位步骤. 根据前文的内容,车牌定位的功能还剩下如下的步骤,见下图中未涂灰的部分. 图1 车牌定位步骤 ...

  10. Atitit 图像处理—图像形态学(膨胀与腐蚀)

    Atitit 图像处理-图像形态学(膨胀与腐蚀) 1.1. 膨胀与腐蚀1 1.2. 图像处理之二值膨胀及应用2 1.3. 测试原理,可以给一个5*5pic,测试膨胀算法5 1.4. Photoshop ...

随机推荐

  1. LangChain的LCEL和Runnable你搞懂了吗

    LangChain的LCEL估计行业内的朋友都听过,但是LCEL里的RunnablePassthrough.RunnableParallel.RunnableBranch.RunnableLambda ...

  2. 【SpringBoot】16 数据访问P4 整合JPA

    DAO面向SpringData操作 Spring Data 项目的目的是为了简化构建基于 Spring 框架应用的数据访问技术, 包括非关系数据库.Map-Reduce 框架.云数据服务等等: 另外也 ...

  3. 【转载】How to Use t-SNE Effectively —— (机器学习数据可视化) t-SNE使用指南

    原文地址:https://distill.pub/2016/misread-tsne/ 说明: 原文是比较有名的一个指南性博文,讲的就是t-SNE技术的一些使用注意事项和说明,属于说明性文章,内容很不 ...

  4. 无缝融入,即刻智能[一]:Dify-LLM大模型平台,零编码集成嵌入第三方系统,42K+星标见证专属智能方案[含ollama部署]

    无缝融入,即刻智能[一]:Dify-LLM大模型平台,零编码集成嵌入第三方系统,42K+星标见证专属智能方案 1.Dify 简介 1.1 功能情况 Dify,一款引领未来的开源大语言模型(LLM)应用 ...

  5. apisix-dashboard上添加自定义插件

    参考:https://overstarry.vip/posts/apisix如何添加自定义插件/ 首先,我们需要向自定义的插件user-remote-auth添加到apisix中,对这块不清楚的同学, ...

  6. Linux下如何在程序中获取某个命令执行的结果?【附源码】

    在工作中遇到一个问题,就是想获取某个函数执行之后打印的字符串信息. 这个功能应用场景挺多的, 特地整理了一下相关知识点分享给大家. 1. 使用临时文件 1) 使用shell的重定向 将命令输出重定向到 ...

  7. SRE 必备知识 - Kafka 探秘之零拷贝技术

    如果你了解过 Kafka,那么它用到的一个性能优化技术可能会引起你的注意 -- 操作系统的零拷贝(zero-copy)优化. 零拷贝操作可以避免对数据的非必要拷贝,当然,并非是说完全没有拷贝. 在 K ...

  8. 编译 Qt 项目

    参考:Qt 编程指南 一个最小化工作示例:qt-minimal | GitHub 源文件 main.cpp #include <QApplication> #include <QLa ...

  9. Java取模和取余,你真的弄懂了吗?

    前言 Java 中常见的取模和取余(求余)计算,在我们日常的很多业务领域都有用到.比如当我们做数据加密时,密码学中不同的加密方案底层会采用不同的模运算来决定其复杂度:做游戏的同学游戏引擎中的取余求最高 ...

  10. layui的各模块的基本用途是什么?

    Layui 是一个流行的前端UI框架,提供了多个模块,每个模块有不同的功能和用途.以下是 Layui 的一些主要模块以及它们的基本用途: 核心模块(layui): Layui 的核心模块包含了一些核心 ...