图像形态学操作(cv2库实现)
#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库实现)的更多相关文章
- 【图像处理】OpenCV+Python图像处理入门教程(七)图像形态学操作
图像形态学主要从图像内提取分量信息,该分量信息通常对表达图像的特征具有重要意义.例如,在车牌号码识别中,能够使用形态学计算其重要特征信息,在进行识别时,只需对这些特征信息运算即可.图像形态学在目标视觉 ...
- 机器学习进阶-图像形态学操作-梯度运算 cv2.GRADIENT(梯度运算-膨胀图像-腐蚀后的图像)
1.op = cv2.GRADIENT 用于梯度运算-膨胀图像-腐蚀后的图像 梯度运算:表示的是将膨胀以后的图像 - 腐蚀后的图像,获得了最终的边缘轮廓 代码: 第一步:读取pie图片 第二步:进行腐 ...
- 机器学习进阶-图像形态学操作-开运算与闭运算 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 ...
- 机器学习进阶-图像形态学操作-膨胀操作 1.cv2.dilate(进行膨胀操作)
1.cv2.dilate(src, kernel, iteration) 参数说明: src表示输入的图片, kernel表示方框的大小, iteration表示迭代的次数 膨胀操作原理:存在一个ke ...
- 机器学习进阶-图像形态学操作-腐蚀操作 1.cv2.erode(进行腐蚀操作)
1.cv2.erode(src, kernel, iteration) 参数说明:src表示的是输入图片,kernel表示的是方框的大小,iteration表示迭代的次数 腐蚀操作原理:存在一个ker ...
- opencv学习笔记(五)----图像的形态学操作
图像的形态学操作有基本的腐蚀和膨胀操作和其余扩展形态学变换操作(高级操作)-----开运算,闭运算,礼帽(顶帽)操作,黑帽操作...(主要也是为了去噪声,改善图像) 形态学操作都是用于处理二值图像(其 ...
- 【OpenCV-Python】-图像形态学转化
原文为段立辉翻译,感谢Linux公社此文档为自学转述,如有侵权请联系本人. 目标: • 学习不同的形态学操作,例如腐蚀,膨胀,开运算,闭运算等 • 学习的函数有:cv2.erode(),cv2.dil ...
- OpenCV中的图像形态学转换
两个基本的形态学操作是腐蚀和膨胀.他们的变化构成了开运算,闭运算,梯度等.下面以这张图为例 1.腐蚀 这个操作会把前景物体的边界腐蚀掉. import cv2 import numpy as np i ...
- EasyPR--开发详解(4)形态学操作、尺寸验证、旋转等操作
在上一篇深度分析与调优讨论中,我们介绍了高斯模糊,灰度化和Sobel算子.在本文中,会分析剩余的定位步骤. 根据前文的内容,车牌定位的功能还剩下如下的步骤,见下图中未涂灰的部分. 图1 车牌定位步骤 ...
- Atitit 图像处理—图像形态学(膨胀与腐蚀)
Atitit 图像处理-图像形态学(膨胀与腐蚀) 1.1. 膨胀与腐蚀1 1.2. 图像处理之二值膨胀及应用2 1.3. 测试原理,可以给一个5*5pic,测试膨胀算法5 1.4. Photoshop ...
随机推荐
- 同时使用mp和mybatis,我的type-aliases-package失效了
mybatis: #mapper配置文件 mapper-locations: classpath:mapper/*.xml type-aliases-package: com.sky.entity c ...
- python统计班级学生
python统计班级学生 如下场景: 假设我有一个学生类和一个班级类,想要实现的功能为: 执行班级人数增加的操作.获得班级的总人数: 学生类继承自班级类,每实例化一个学生,班级人数都能增加 ...
- 【Java】【常用类】LocalDateTime 当前日期时间类 相关
LocalDate主要的三个API类: java.time.LocalDate; java.time.LocalDateTime; java.time.LocalTime; LocatDate对象获取 ...
- 【RabbitMQ】01 简单模式
参考自腾讯云的实验课堂,减少部署时间的折腾 1.创建Erlang.Repo库 curl -s https://packagecloud.io/install/repositories/rabbitmq ...
- SourceGenerator 生成db to class代码优化结果记录 二
优化 在上一篇留下的 Dapper AOT 还有什么特别优化点的问题 在仔细阅读生成代码和源码之后,终于得到了答案 个人之前一直以为 Dapper AOT 只用了迭代器去实现,所以理应差不多实现代码却 ...
- Efficientvit: Enhanced linear attention for high-resolution low-computation visual recognition
GitHub地址: https://github.com/mit-han-lab/efficientvit#usage 相关: https://www.jetson-ai-lab.com/vit/tu ...
- 网络问题解决:Ubuntu连接局域网中Windows主机上的v2r报错:rejected core/proxy/socks: unknown Socks version: 67
参考: https://github.com/2dust/v2rayN/issues/3916 https://www.eolink.com/news/post/30941.html ======== ...
- 实验室深度学习服务器崩溃——Oops: 0000 [#1] SMP NOPTI
这两天实验室的服务器总是崩溃,重启已经不能解决问题了,由于是跑深度学习的服务器,而且还是承接国家级项目的运行服务器,可以说是实验室的主要生产力了,给出报错的日志: Oct 16 09:42:33 ro ...
- vue&element项目实战 之api模块化与公共字典
4.api模块化配置 步骤一:编写字典api即dic.js import request from '@/utils/request' // 查询字典列表 export const getDicLis ...
- 用户案例 | Apache DolphinScheduler 离线调度在自如多业务场景下的应用与实践
用户案例 | 自如 随着自如业务的快速发展,不断增长的调度任务和历史逾万的存量任务对平台稳定性提出了更高的要求.同时,众多非专业开发人员也需要一种更为"亲民"的调度平台使用体验. ...