OpenCV(九)形态学操作4--礼帽与黑帽(顶帽与底帽)
目录
一、顶帽运算(礼帽)
二、底帽运算(黑帽)
三、底帽运算应用(二值图像底帽运算)
1、原图转灰度图,再转二值图像
2、灰度图底帽处理
3、二值图闭运算
代码
总代码
参考资料
一、顶帽运算(礼帽)
取出亮度高的地方
顶帽运算 = 原图像 - 开运算
开运算可以消除暗背景下的高亮区域,那么如果用原图减去开运算结果就可以得到原图中灰度较亮的区域,所以又称白顶帽变换。
C++:
//顶帽运算
void TopHat()
{//开运算Mat kernel = getStructuringElement(MORPH_RECT, Size(19, 19)); //创建结构元// 矩形卷积核 尺寸为(19,19)宽高morphologyEx(img, dst, MORPH_OPEN, kernel, Point(-1, -1)); // 形态学处理--开运算// 原图 新图 开运算 卷积核 锚点 imshow("开运算", dst); // 显示形态学处理后的效果//顶帽运算(白顶帽运算)dst = img - dst;//morphologyEx(img, dst, MORPH_TOPHAT, kernel, Point(-1, -1), 1); // 形态学处理--开帽变换imshow("顶帽运算", dst);
}
python:
# 顶帽(原-开)
def TopHat():tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, (7, 7), iterations=5)
# 类型 卷积核 迭代次数cv2.imshow('TopHat', tophat)
二、底帽运算(黑帽)
取出亮度低的地方
底帽运算 = 原图像 - 闭运算
闭运算可以删除亮背景下的暗区域,那么用原图减去闭运算结果就可以得到原图像中灰度较暗的区域,所以又称黑底帽变换。
C++:
//底帽运算
void BlackHat()
{//闭运算Mat kernel = getStructuringElement(MORPH_RECT, Size(19, 19)); //创建结构元// 矩形卷积核 尺寸为(19,19)宽高morphologyEx(img, dst, MORPH_CLOSE, kernel, Point(-1, -1)); // 形态学处理--开运算// 原图 新图 闭运算 卷积核 锚点 imshow("闭运算", dst); // 显示形态学处理后的效果//底帽运算(黑帽运算)//morphologyEx(img, dst, MORPH_BLACKHAT, kernel, Point(-1, -1), 1); // 形态学处理--底帽变换dst = img - dst;imshow("底帽运算", dst);
}
python:
# 底帽(原-闭)
def BlackHat():blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, (7, 7), iterations=5)
# 类型 卷积核 迭代次数cv2.imshow('BlackHat', blackhat)
只有这样可能看不出来用途,再举一个实用的例子:
三、底帽运算应用(二值图像底帽运算)
目的:得到清晰的二值图像。
底帽效果:取出亮度较暗的区域。
1、原图转灰度图,再转二值图像
//灰度图及二值化
cvtColor(img, grayImage, COLOR_BGR2GRAY);
imshow("灰度图(原图)", grayImage);
threshold(grayImage, binImage, 0, 255, THRESH_OTSU);
imshow("二值化图像", binImage);
可以看出,虽然圆环被分割为目标区域,但左侧背景区域有很大一部分也被分割为目标,并且该区域面积较大,难以通过开操作或闭操作去除。
为了取出亮度低的地方,接下来我们通过底帽操作来进行处理。首先对原图进行底帽处理,然后再对底帽处理的结果进行二值化,最后对处理结果进行一轮闭操作。
2、灰度图底帽处理
kernel = getStructuringElement(MORPH_RECT, Size(31, 31)); //修改结构元
morphologyEx(grayImage, dst, MORPH_BLACKHAT, kernel, Point(-1, -1), 1); // 形态学处理--底帽变换
imshow("底帽运算", dst);
threshold(dst, binImage, 0, 255, THRESH_OTSU);
imshow("底帽处理后的二值化图像", binImage);
3、二值图闭运算
//3、二值图闭运算处理
kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); //修改结构元
morphologyEx(binImage, binImage, MORPH_CLOSE, kernel, Point(-1, -1)); // 形态学处理--闭运算
imshow("闭运算处理后的二值化图像", binImage);
代码
//二值图像底帽运算
void Bin_BlackHat()
{Mat kernel = getStructuringElement(MORPH_RECT, Size(19, 19)); //创建结构元//1、灰度图及二值化cvtColor(img, grayImage, COLOR_BGR2GRAY);imshow("灰度图(原图)", grayImage);threshold(grayImage, binImage, 0, 255, THRESH_OTSU);imshow("二值化图像", binImage);//2、对灰度图底帽处理kernel = getStructuringElement(MORPH_RECT, Size(31, 31)); //修改结构元morphologyEx(grayImage, dst, MORPH_BLACKHAT, kernel, Point(-1, -1), 1); // 形态学处理--底帽变换imshow("底帽运算", dst);threshold(dst, binImage, 0, 255, THRESH_OTSU);imshow("底帽处理后的二值化图像", binImage);//3、二值图闭运算处理kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); //修改结构元morphologyEx(binImage, binImage, MORPH_CLOSE, kernel, Point(-1, -1)); // 形态学处理--闭运算imshow("闭运算处理后的二值化图像", binImage);
}
总代码
//开运算与闭运算(形态学)
#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;Mat img, dst;
Mat binImage, grayImage;//图像初始化
void Image_Init()
{img = imread("Resource/test9.jpg");dst = Mat::zeros(img.size(), img.type());if (img.empty()){printf("图像加载失败");exit(0);}
}//顶帽运算
void TopHat()
{//开运算Mat kernel = getStructuringElement(MORPH_RECT, Size(19, 19)); //创建结构元// 矩形卷积核 尺寸为(19,19)宽高morphologyEx(img, dst, MORPH_OPEN, kernel, Point(-1, -1)); // 形态学处理--开运算// 原图 新图 开运算 卷积核 锚点 imshow("开运算", dst); // 显示形态学处理后的效果//顶帽运算(白顶帽运算)dst = img - dst;//morphologyEx(img, dst, MORPH_TOPHAT, kernel, Point(-1, -1), 1); // 形态学处理--开帽变换imshow("顶帽运算", dst);
}//底帽运算
void BlackHat()
{//闭运算Mat kernel = getStructuringElement(MORPH_RECT, Size(19, 19)); //创建结构元// 矩形卷积核 尺寸为(19,19)宽高morphologyEx(img, dst, MORPH_CLOSE, kernel, Point(-1, -1)); // 形态学处理--闭运算// 原图 新图 闭运算 卷积核 锚点 imshow("闭运算", dst); // 显示形态学处理后的效果//底帽运算(黑帽运算)//morphologyEx(img, dst, MORPH_BLACKHAT, kernel, Point(-1, -1), 1); // 形态学处理--底帽变换dst = img - dst;imshow("底帽运算", dst);
}//二值图像底帽运算
void Bin_BlackHat()
{Mat kernel = getStructuringElement(MORPH_RECT, Size(19, 19)); //创建结构元//1、灰度图及二值化cvtColor(img, grayImage, COLOR_BGR2GRAY);imshow("灰度图(原图)", grayImage);threshold(grayImage, binImage, 0, 255, THRESH_OTSU);imshow("二值化图像", binImage);//2、对灰度图底帽处理kernel = getStructuringElement(MORPH_RECT, Size(31, 31)); //修改结构元morphologyEx(grayImage, dst, MORPH_BLACKHAT, kernel, Point(-1, -1), 1); // 形态学处理--底帽变换imshow("底帽运算", dst);threshold(dst, binImage, 0, 255, THRESH_OTSU);imshow("底帽处理后的二值化图像", binImage);//3、二值图闭运算处理kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); //修改结构元morphologyEx(binImage, binImage, MORPH_CLOSE, kernel, Point(-1, -1)); // 形态学处理--闭运算imshow("闭运算处理后的二值化图像", binImage);
}//显示图像
void Show()
{imshow("原图", img);
}int main()
{Image_Init(); //图像初始化//TopHat(); //顶帽运算//BlackHat(); //底帽运算Bin_BlackHat(); //二值图像底帽运算Show(); //显示原图像waitKey(0);return 0;
}
# 形态学(膨胀、腐蚀、开闭运算、顶帽与底帽)
import cv2# 膨胀
def Dilate():# 膨胀dilate = cv2.dilate(img, kernel=(7, 7), iterations=1)# 卷积核大小 迭代次数cv2.imshow("dilate", dilate)# 腐蚀
def Enrode():# 腐蚀erode = cv2.erode(img, kernel=(7, 7), iterations=5)# 卷积核大小 迭代次数cv2.imshow("erode", erode)# 开运算(先腐后膨)
def Open():open = cv2.morphologyEx(img, cv2.MORPH_OPEN, (7, 7), iterations=5)# 类型 卷积核大小 迭代次数cv2.imshow('open', open)# 闭运算(先膨后腐)
def Close():close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, (7, 7), iterations=5)# 类型 卷积核大小 迭代次数cv2.imshow('close', close)# 顶帽(原-开)
def TopHat():tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, (7, 7), iterations=5)
# 类型 卷积核 迭代次数cv2.imshow('TopHat', tophat)# 底帽(原-闭)
def BlackHat():blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, (7, 7), iterations=5)
# 类型 卷积核 迭代次数cv2.imshow('BlackHat', blackhat)if __name__ == '__main__':# 读取图片img = cv2.imread("Resource/test5.jpg")cv2.imshow("img", img)Dilate() #膨胀Enrode() #腐蚀Open() #开运算Close() #闭运算TopHat() #顶帽运算BlackHat() #底帽运算cv2.waitKey(0)
参考资料
https://blog.csdn.net/weixin_41695564/article/details/79935028
https://blog.csdn.net/freehawkzk/article/details/85261341?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162864358216780255258035%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162864358216780255258035&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-5-85261341.first_rank_v2_pc_rank_v29&utm_term=%E9%A1%B6%E5%B8%BD%E4%B8%8E%E5%BA%95%E5%B8%BD&spm=1018.2226.3001.4187
OpenCV(九)形态学操作4--礼帽与黑帽(顶帽与底帽)相关推荐
- opencv —— morphology形态学操作函数讲解(python)
opencv -- morphology形态学操作函数讲解 目录 opencv -- morphology形态学操作函数讲解 形态学滤波:morphologyEx 函数 开运算:先腐蚀后膨胀. 闭运算 ...
- opencv 的形态学操作,cv2.erode,cv.dilate等。
opencv 的形态学操作,cv2.erode,cv.dilate,cv2.morphologyEx的使用. 一.膨胀 cv2.erode(img, kernel_size) 函数参数, img是输入 ...
- 使用Python,OpenCV进行形态学操作
使用Python,OpenCV进行形态学操作) 1. 效果图 2. 原理 3. 源码 3.1 [制作logo源码](https://blog.csdn.net/qq_40985985/article/ ...
- OpenCV通过形态学操作提取水平线和垂直线
OpenCV通过形态学操作提取水平线和垂直线 通过形态学操作提取水平线和垂直线 目标 理论 形态学运算 结构元素 代码 说明/结果 载入图片 灰阶 灰度到二进制图像 输出图像 结构要素 优化边缘/结果 ...
- 用openCV实现形态学操作
尊师: © Fu Xianjun. All Rights Reserved. 老样子先进行把图片放入文件夹如何用openCV打开 形态学操作(移除噪声) 先使用开运算去除图像中的细小白色噪点,然后通过 ...
- 基于python的opencv图像形态学处理(图像腐蚀与膨胀操作以及礼帽与黑帽)
腐蚀与膨胀 图像的腐蚀与膨胀互为逆向操作,通常用于处理二值图像(黑白图,以黑色为底面背景),因此需要先进行二值化处理,腐蚀和膨胀通俗的理解就是,在指定大小的卷积核内,如果该卷积核内全为黑色或全为白色, ...
- OPenCv java 形态学操作(12)
创建图片 Mat mat=new Mat();mat.create(new Size(516,516),CvType.CV_8UC3);Imgproc.putText(mat, "hello ...
- 图像开运算、闭运算、形态学梯度、“礼帽”和“黑帽”
一.概念 图像的腐蚀和膨胀可以做更多的事情,可以通过膨胀和腐蚀来做一些图像的高级形态学变化,图像的高级形态学变化 有图像的开运算.闭运算.形态学梯度.顶帽,黑帽. 二.图像高级形态学变化 1.开运算: ...
- 基于OpenCV [c++]——形态学操作(分析和应用)
摘要: 形态学一般指生物学中研究动物和植物结构的一个分支.用数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具. 基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对 ...
最新文章
- ubuntu 安装 codelite
- webapi支持session
- tableau实战系列(二十五)-如何将 R语言与tableau进行结合,实现聚类分析
- java json自定义_java返回json设置自定义的格式
- Intellij IDEA创建的Web项目配置Tomcat并启动Maven项目
- 斯坦福大学NLP公开课CS224n上映啦!华人助教陪你追剧
- python下雨动画特效_pygame用blit()实现动画效果
- 知道硬盘很慢,但没想到比 CPU Cache 慢 10000000 倍!
- 凸优化第六章逼近与拟合 6.3 正则化逼近
- C# Panel 双缓存;图片闪烁处理方式,视频闪烁处理方式
- python常用库大全文库_Python库参考手册
- 解决Office桌面图标异常
- 识别中Excel的空值和空格值
- WIndows 7 拷贝XP的共享文件夹时,出现您需要权限来执行此操作 的提示
- TensorFlow实现鸢尾花分类
- CocoaPods制作第三方库,管理自己的私有库以及发布官方库(模块化与组件化)
- Scala開發教程(1): 開始神奇的Scala編程之旅
- MTK平台唤醒源分类
- 01背包+概率dp Just another Robbery 抢银行
- Process的使用
热门文章
- 可信计算和可信赖计算的渊源
- 优思学院|“丰田生产方式“和“福特生产方式”的区别
- (转)ASP.NET 脚本语言介绍
- 在Windows server2012R2上面解压安装MySQL出现丢失msvcp100.dll(亲测有效)
- 第二章、质量管理体系综述
- SQL Server数据库技术文档
- Linux怎么输出函数,Linux C 程序 输入输出函数(THREE)
- selenium抓取苏宁图书
- 汇编指令msr_ARM汇编指令MRS和MSR(转)
- Windows 10 PE的程序包