-
腐蚀和膨胀
2020-06-23 19:23:32形态学操作中,腐蚀和膨胀原理很简单常用语二值图像,可以看做一种广义的卷积操作。 腐蚀(腐蚀黑色像素为例): 一副二值图像,遍历窗口和卷积核‘’卷积‘’所得值为图像再赋值,其中的卷积规则为遍历窗口各个位置...形态学操作中,腐蚀和膨胀原理很简单常用语二值图像,可以看做一种广义的‘’卷积‘’操作。
腐蚀(腐蚀黑色像素为例):
一副二值图像,遍历窗口和卷积核‘’卷积‘’所得值为图像再赋值,其中的‘’卷积‘’规则为遍历窗口各个位置上的黑色像素排布至少有卷积核黑色像素排布则卷积值即窗口中心重新赋值为黑,否则为白。遍历窗口移动直至整副图像遍历完成,卷积值组成的图像就是腐蚀处理之后的图像。(所谓A黑色素排布中至少有B黑色素排布是说:A中任意一个是黑的位置,则B中对该位置也为黑)
膨胀(膨胀黑色像素为例):
一副二值图像,遍历窗口和卷积核‘’卷积‘’所得值为图像再赋值,其中的‘’卷积‘’规则为如果遍历窗口中心位置上的像素和卷积核中心位置处值为同值则卷积核中所有黑色位置对应遍历窗口相应位置重新赋值为黑色。遍历窗口移动直至整副图像遍历完成。
一副正常的图片转化为二值图片后进行腐蚀:
void test_etch() { Mat src = imread("d:/2.jpg", 0); Mat dst(src.rows, src.cols, CV_8UC1); Mat value2(src.rows, src.cols, CV_8UC1); for (int i = 0; i < src.rows; i++) { uchar* s= src.ptr<uchar>(i); uchar* v = value2.ptr<uchar>(i); for (int j = 0; j < src.cols; j++) { v[j]=s[j]>70?0:255; } } imshow("二值化图片", value2); for (int i = 1; i < src.rows - 1; i++) { uchar* src_prev = src.ptr<uchar>(i - 1); uchar* src_cur = src.ptr<uchar>(i); uchar* src_next = src.ptr<uchar>(i + 1); uchar* dst_cur = dst.ptr<uchar>(i); for (int j = 1; j < src.cols - 1; j++) { bool rel = src_prev[j] > 70 && src_cur[j] > 70 && src_cur[j - 1] > 70 && src_cur[j + 1] > 70 && src_next[j] > 70; if (!rel)//上下左右四像素全为黑该像素才可为黑 dst_cur[j] = 255; else dst_cur[j] = 0; } } imshow("腐蚀黑色区域之后", dst); waitKey(); }
-
腐蚀 和 膨胀
2014-03-15 06:57:49创建 滑动窗口 //创建 滑动窗口 IplConvKernel *element=0;...//最后一个参会:腐蚀的次数 取最小值 替换描点。-- 膨胀 - 取最大值 cvDilate(...).创建 滑动窗口
//创建 滑动窗口 IplConvKernel *element=0; int values[16]={ 0,0,0,0, 0,0,1,0, 0,1,1,0, 0,0,0,0 }; int cols=4,rows=4,anchor_x=2,anchor_y=2; element=cvCreateStructuringElementEx(cols,rows,anchor_x,anchor_y,CV_SHAPE_CUSTOM,values); cvErode(src,dst,element,1);//最后一个参会:腐蚀的次数
取最小值 替换描点。-- 膨胀 - 取最大值 cvDilate(...). -
图像腐蚀和膨胀
2018-04-09 20:23:57图像腐蚀和膨胀案例,引用c -
腐蚀和膨胀的matlab实现
2020-07-31 13:46:05本文给大家分享了一个腐蚀和膨胀的matlab实现的源代码。 -
腐蚀膨胀算法 java_opencv腐蚀和膨胀
2021-02-26 13:36:50本文目的目的:学习使用opencv的腐蚀和膨胀。不介绍算法,只以使用者的角度来理解语言:java版本:opencv-410分解介绍膨胀与腐蚀,关于算法方面的介绍不太懂,太复杂,只想从使用者的角度来理解下。膨胀的作用:将...本文目的
目的:学习使用opencv的腐蚀和膨胀。不介绍算法,只以使用者的角度来理解
语言:java
版本:opencv-410
分解介绍
膨胀与腐蚀,关于算法方面的介绍不太懂,太复杂,只想从使用者的角度来理解下。膨胀的作用:将白色区域变大,可以使相互分离的物体连接起来
腐蚀的作用:将黑色区域变大,可以断开两个连接在一起的物体
所以
使用膨胀时,图像会变的越来越亮,白色区域越来越多
使用腐蚀时,图像会变得越来越暗,黑色区域越来越多。
如官方文档的案例中:
原图:
膨胀后图片:可以看到白色区域变大了
腐蚀后图片:可以看到白色区域变小了
膨胀函数
javadoc:
dilate(Mat src, Mat dst, Mat kernel)_dilate(Mat src, Mat dst, Mat kernel, Point anchor)
腐蚀函数
__javadoc:_
erode(Mat src, Mat dst, Mat kernel)
erode(Mat src, Mat dst, Mat kernel, Point anchor)
内核元素的构造
无论腐蚀还是膨胀都要先构造一个内核元素,也是一个Mat元素
对于自定义一个结构元素kernel,OpenCV提供了一个函数getStructuringElement,可以获取常用的结构元素的形状:矩形(包括线形)、椭圆(包括圆形)及十字形。
getStructuringElement的内部并没有什么优化实现,只是封装了一下功能。其原理同样是声明一个Mat,然后求形状,指定Mat的值。
总之:getStructuringElement是一种更加简便的方法实现一个kernel。
元素类型
结构性元素类型有三种:矩形,椭圆和十字
Imgproc.CV_SHAPE_RECT;
Imgproc.CV_SHAPE_CROSS;
Imgproc.CV_SHAPE_ELLIPSE;
三种类型元素,腐蚀时效果不一样,在下面的程序运行时拖动slider,可以看到。
代码
package com.joe.vision.machine.vision.samples;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.core.Point;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.springframework.util.ResourceUtils;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
/*** 膨胀与腐蚀* 膨胀的作用:将白色区域变大* 腐蚀的作用:将黑色区域变大*/
public class MorphologyDemo1 {
private static final String[] ELEMENT_TYPE = {"矩形", "十字", "椭圆"};
private static final String[] MORPH_OP = {"腐蚀", "膨胀"};
private static final int MAX_KERNEL_SIZE = 100;
private Mat matImgSrc;
private Mat matImgDst = new Mat();
private int elementType = Imgproc.CV_SHAPE_RECT;
private int kernelSize = 0;
private boolean doErosion = true;
private JFrame frame;
private JLabel imgLabel;
public MorphologyDemo1(String[] args) throws FileNotFoundException {
matImgSrc = Imgcodecs.imread(getFilePath("static/time.jpg"));
if (matImgSrc.empty()) {
System.out.println("Empty image:" );
System.exit(0);
}
// Create and set up the window. frame = new JFrame("膨胀和腐蚀的demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Set up the content pane. Image img = HighGui.toBufferedImage(matImgSrc);
addComponentsToPane(frame.getContentPane(), img);
// Use the content pane's default BorderLayout. No need for // setLayout(new BorderLayout()); // Display the window. frame.pack();
frame.setVisible(true);
}
private void addComponentsToPane(Container pane, Image img) {
if (!(pane.getLayout() instanceof BorderLayout)) {
pane.add(new JLabel("Container doesn't use BorderLayout!"));
return;
}
JPanel sliderPanel = new JPanel();
sliderPanel.setLayout(new BoxLayout(sliderPanel, BoxLayout.PAGE_AXIS));
//构造元素类型下拉选框 JComboBox elementTypeBox = buildElementTypeBox();
sliderPanel.add(elementTypeBox);
sliderPanel.add(new JLabel("内核尺寸: 2n + 1"));
//构造slider工具条 JSlider slider = buildSlider();
sliderPanel.add(slider);
//构造操作类型下拉选框,操作分为腐蚀和膨胀 JComboBox morphOpBox = buildOperateType();
sliderPanel.add(morphOpBox);
pane.add(sliderPanel, BorderLayout.PAGE_START);
imgLabel = new JLabel(new ImageIcon(img));
pane.add(imgLabel, BorderLayout.CENTER);
}
private JComboBox buildOperateType() {
JComboBox morphOpBox = new JComboBox<>(MORPH_OP);
morphOpBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
@SuppressWarnings("unchecked")
JComboBox cb = (JComboBox) e.getSource();
doErosion = cb.getSelectedIndex() == 0;
update();
}
});
return morphOpBox;
}
private JComboBox buildElementTypeBox() {
JComboBox elementTypeBox = new JComboBox<>(ELEMENT_TYPE);
elementTypeBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
@SuppressWarnings("unchecked")
JComboBox cb = (JComboBox) e.getSource();
if (cb.getSelectedIndex() == 0) {
elementType = Imgproc.CV_SHAPE_RECT;
} else if (cb.getSelectedIndex() == 1) {
elementType = Imgproc.CV_SHAPE_CROSS;
} else if (cb.getSelectedIndex() == 2) {
elementType = Imgproc.CV_SHAPE_ELLIPSE;
}
update();
}
});
return elementTypeBox;
}
private JSlider buildSlider() {
JSlider slider = new JSlider(0, MAX_KERNEL_SIZE, 0);
slider.setMajorTickSpacing(5);
slider.setMinorTickSpacing(5);
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider) e.getSource();
kernelSize = source.getValue();
update();
}
});
return slider;
}
private void update() {
//OpenCV提供了一个函数getStructuringElement,可以获取常用的结构元素的形状:矩形(包括线形)、椭圆(包括圆形)及十字形。 Mat element = Imgproc.getStructuringElement(elementType, new Size(2 * kernelSize + 1, 2 * kernelSize + 1), new Point(kernelSize, kernelSize));
if (doErosion) {
//腐蚀 erode(element);
} else {
//膨胀 dilate(element);
}
Image img = HighGui.toBufferedImage(matImgDst);
imgLabel.setIcon(new ImageIcon(img));
frame.repaint();
}
private void dilate(Mat element) {
Imgproc.dilate(matImgSrc, matImgDst, element);
}
private void erode(Mat element) {
Imgproc.erode(matImgSrc, matImgDst, element);
}
public String getFilePath(String filename) throws FileNotFoundException {
File file = ResourceUtils.getFile(filename);
return file.getAbsolutePath();
}
public static void main(String[] args) {
// Load the native OpenCV library System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
new MorphologyDemo1(args);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
});
}
}
效果
原图:
腐蚀效果:黑色区域变大,图片黑化
膨胀效果:白色区域变大
-
Matlab基于腐蚀和膨胀的边缘检测x_腐蚀膨胀算法原理
2020-02-28 14:18:44Matlab 基于腐蚀和膨胀的边缘检测 文/天神 一.课题背景 形态学运算只针对二值图像二进制图像并依据数学形态学Mathermatical Morphogy集合论方法发展起来 的图像处理方法起源于岩相对岩石结构的定量描述工作在数字... -
matlab图像的腐蚀和膨胀_OpenCV图像处理系列八 --- 腐蚀与膨胀
2021-01-08 03:20:13今天,我们一起来学习图像形态...其基本的运算包括:腐蚀和膨胀、开运算和闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换等。腐蚀与膨胀主要实现以下功能:消除噪声分割...今天,我们一起来学习图像形态学操作中两种最基本的形态学操作,即腐蚀与膨胀。
一、理论
数学形态学(Mathematical morphology) 是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:腐蚀和膨胀、开运算和闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换等。
腐蚀与膨胀主要实现以下功能:
- 消除噪声
- 分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
- 寻找图像中的明显的极大值区域或极小值区域
- 求出图像的梯度
1、腐蚀
腐蚀对图像求局部最小值;腐蚀操作就是将图像(或图像的一部分区域,我们称之为A)与卷积核(我们称之为B)进行卷积。
核可以是任何的形状和大小,它拥有一个单独定义出来的参考点,我们称其为锚点。多数情况下,核是一个小的中间带有参考点和实心正方形或者圆盘,其实,我们可以把核视为模板或者掩码。
1)腐蚀的数学表达式
腐蚀的数学表达式
2)腐蚀效果演示
腐蚀效果演示
3)腐蚀的作用:
- 对象大小减小一个像素(3x3)
- 平滑对象边缘
- 弱化或者分割图像之间的半岛型连接
2、膨胀
膨胀对图像求局部的最大值;核B与图形卷积,即计算核B覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素;这样就会使图像中的高亮区域逐渐增长。
核可以是任何的形状和大小,它拥有一个单独定义出来的参考点,我们称其为锚点。多数情况下,核是一个小的中间带有参考点和实心正方形或者圆盘,其实,我们可以把核视为模板或者掩码。
1)膨胀的数学表达式
膨胀的数学表达式
膨胀效果演示
膨胀的作用:
- 对象大小增加一个像素(3x3)
- 平滑对象边缘
- 减少或者填充对象之间的距离
小结:
可以看做膨胀是将白色区域扩大,腐蚀是将黑色区域扩大。
二、OpenCV腐蚀与膨胀API函数详解
1、腐蚀
1)函数原型:
void erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1, -1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue());
2)函数功能:
用指定的卷积核腐蚀图像,使用像素邻域内的局部极小运算符来腐蚀一张图片,从src输入,由dst输出,支持就地(in-place)操作。
3)参数详解:
- 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像通道的数量可以是任意的,但图像深度应为CV_8U,CV_16U,CV_16S,CV_32F或 CV_64F其中之一;
- 第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型;
- 第三个参数,InputArray类型的kernel,腐蚀操作的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵);
- 第四个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于单位(element)的中心,我们一般不用管它;
- 第五个参数,int类型的iterations,迭代使用erode()函数的次数,默认值为1;
- 第六个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT;
- 第七个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。
第三个参数一般用getStructuringElement()函数获取卷积核的大小;getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。
其中,getStructuringElement函数的第一个参数表示内核的形状,我们可以选择如下三种形状之一:
- 矩形: MORPH_RECT
- 交叉形: MORPH_CROSS
- 椭圆形: MORPH_ELLIPSE
而getStructuringElement函数的第二和第三个参数分别是内核的尺寸以及锚点的位置。
我们一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。对于锚点的位置,有默认值Point(-1, -1),表示锚点位于中心;并且需要注意,十字形的element形状唯一依赖于锚点的位置;而在其他情况下,锚点只是影响了形态学运算结果的偏移。
4)实例:
#include #include #include #include using namespace std;using namespace cv;int main(){ //载入原图 Mat image = imread("lena.png"); if (image.empty()) { printf("image error!"); return -1; } //创建窗口 namedWindow("【原图】腐蚀操作"); namedWindow("【效果图】腐蚀操作"); //显示原图 imshow("【原图】腐蚀操作
-
图像的腐蚀和膨胀
2020-03-25 10:46:46图像处理分为多种,对于不同的图像腐蚀和膨胀的定义不同。 1、形态学图像处理是在图像中移动一个结构元素,然后将结构元素与下面的二值图像进行交、并等集合运算;先腐蚀后膨胀的过程称为开运算。 它具有消除细小... -
一、腐蚀和膨胀
2018-11-01 15:11:21一、腐蚀和膨胀 1、腐蚀和膨胀的主要功能 (1)消除噪声 (2)分割出独立的图像元素,在图像中连接相邻的元素 (3)寻找图像中的极大值或者极小值区域 (4)求出图像的梯度 2、膨胀(dilate) 膨胀就是求局部... -
OpenCV中的腐蚀和膨胀
2021-02-20 12:41:44OpenCV中的腐蚀和膨胀 代码实现: import cv2 import numpy as np #腐蚀和膨胀 #腐蚀的作用就是让暗的区域变大,而膨胀的作用就是让亮的区域变大 img = cv2.imread('measure.png') img = cv2.medianBlur(img,5) cv2.... -
形态学腐蚀和膨胀原理和python实现
2020-12-16 14:00:27形态学腐蚀和膨胀原理和python实现 这篇笔记为形态学膨胀(dilate)和腐蚀(erode),一种在数字图像处理中常用的基本算法。 形态学图像处理的理论根基是数学形态学(Mathematical Morphology),可以通过形态学... -
opencv python 图片腐蚀和膨胀
2017-07-18 23:04:08opencv python 图片腐蚀和膨胀 -
imgproc模块—腐蚀和膨胀
2017-06-11 09:44:22imgproc模块--腐蚀和膨胀 -
形态学处理腐蚀和膨胀
2020-02-02 21:07:13图像的腐蚀和膨胀都属于形态学的基本运算。什么是形态学?形态学操作可以说是基于形状的一系列图像处理操作,通过将结构元素(这里是kernal)作用于输入图像,从而得到输出图像。大都是在二值图像的基础上进行的操作... -
MATLAB实现利用形态学方法去噪(腐蚀和膨胀)
2019-05-07 21:40:16本代码由MATLAB语言编写,通过形态学方法,即腐蚀和膨胀进行图像内部的噪声处理,实现去噪效果,内附有处理过程和处理结果 -
Matlab基于腐蚀和膨胀的边缘检测
2013-07-28 16:52:05用于图像处理的Matlab腐蚀和膨胀的边缘检测方法 -
形态学图像处理: 腐蚀和膨胀
2019-11-20 10:46:49形态学图像处理的两个最基本的概念为腐蚀和膨胀。 腐蚀 膨胀 相关实现代码及编译输出 Mat erodeImage,dilateImag... -
形态学图像处理——腐蚀和膨胀
2020-10-28 18:37:31其基本的运算包括二值化腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中于击不中变换、形态学梯度、 Top-hat变换、颗粒分析、流域变换、灰度腐蚀和膨胀、灰度开闭运算、灰值形态学梯度等。 3、膨胀与腐蚀的... -
OpenCV图像腐蚀和膨胀
2014-07-02 22:43:20图像腐蚀和膨胀,属于数学形态学在数字图像中的应用。 -
二值图像的腐蚀和膨胀
2017-07-12 14:33:00二值图像的腐蚀和膨胀图像数字处理中应用相当广泛,代码处理也很简单,只不过一些资料在介绍腐蚀和膨胀原理时,用一些形态学、集合上的概念和术语,搞得也有些”高深莫测“了。 从图像处理角度看,二值图像的腐蚀... -
对腐蚀 和 膨胀 的理解
2017-11-21 16:34:06对腐蚀 和 膨胀 的理解 原理:在特殊领域运算形式——结构元素(Sturcture Element),在每个像素位置上与二值图像对应的区域进行特定的逻辑运算。运算结构是输出图像的相应像素。运算效果取决于结构元素大小... -
OpenCV-Python图像处理:腐蚀和膨胀原理及erode、dilate函数介绍
2020-11-03 19:18:47本文作为老猿介绍图像腐蚀和膨胀处理的首篇文章,主要介绍腐蚀和膨胀的基础概念、腐蚀和膨胀的基本运算过程、OpenCV腐蚀和膨胀函数erode、dilate语法以及简单应用,并提供了老猿觉得有参考价值的一些博文参考。 -
opencv rect画旋转矩形_opencv腐蚀和膨胀
2021-01-08 03:20:37opencv腐蚀和膨胀本文目的目的:学习使用opencv的腐蚀和膨胀。不介绍算法,只以使用者的角度来理解语言:java版本:opencv-410分解介绍膨胀与腐蚀,关于算法方面的介绍不太懂,太复杂,只想从使用者的角度来理解下。...
-
LVS + Keepalived 实现 MySQL 负载均衡与高可用
-
linux下python3出现 no module named pip
-
使用vue搭建微信H5公众号项目
-
在线课程学习平台有哪些优势?
-
Surver of Spectrum Regulation.pdf
-
QtWidgetsApplication2.rar
-
基于I/Q调制器的频率锁定多载波光源的产生
-
为了让你在“口袋奇兵”聊遍全球,Serverless 做了什么?
-
79935053DockPanel_2_2_Source.rar
-
为下一代公共安全应用程序构建云平台
-
libFuzzer视频教程
-
python导入模块错误
-
OpenCV3.2的opencv_ffmpeg及ippicv.zip
-
【布道者】Linux极速入门
-
基于噪声估计和稀疏纹理的图像篡改检测
-
NFS 实现高可用(DRBD + heartbeat)
-
RIKIROBOT 使用文档 V1.0.pdf
-
互联网医疗行业:决胜时刻到来.pdf
-
2021年金三银四稳了,阿里面试官的面试题库被泄露,手慢无!
-
朱老师鸿蒙系列课程第1期-2鸿蒙系统Harmonyos源码架构分析