首页 > 其他分享 >OpenCV图像处理——形态学操作

OpenCV图像处理——形态学操作

时间:2024-10-19 14:17:02浏览次数:3  
标签:src MORPH int cv2 形态学 OpenCV 图像处理 操作 size

1.形态学操作

图像形态学操作:基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学。

形态学有四个基本操作:膨胀、腐蚀、开、闭。

2.膨胀与腐蚀

2.1.膨胀

跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状

(左图为原图,右图为膨胀操作之后的输出图像。)

2.2.腐蚀

腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值。

(左图为原图,右图为腐蚀操作之后的输出图像。)

2.3.相关API

2.3.1.getStructuringElement

getStructuringElement函数会返回指定形状和尺寸的结构元素。

Mat getStructuringElement(
	int shape,
	Size ksize,
	Point anchor=Point(-1,-1)
);
  • 参数int shape表示内核的形状,有三种形状可以选择:
    1. 矩形MORPH_RECT
    2. 十字形MORPH_CROSS
    3. 椭圆MORPH_ELLIPSE
  • 参数Size ksize表示内核的大小(必须为正奇数)。
  • 参数Point anchor表示内核的锚点,默认位置在中心。

三种内核形状的说明,以5*5大小的内核为例:

	
#MORPH_RECT
1 1 1 1 1 
1 1 1 1 1 
1 1 1 1 1 
1 1 1 1 1 
1 1 1 1 1

#MORPH_CROSS
0 0 1 0 0 
0 0 1 0 0 
1 1 1 1 1 
0 0 1 0 0 
0 0 1 0 0 

#MORPH_ELLIPSE
0 0 1 0 0 
1 1 1 1 1 
1 1 1 1 1 
1 1 1 1 1 
0 0 1 0 0

2.3.2.膨胀

	
void dilate( 
	InputArray src,//原始图像
	OutputArray dst,//输出图像
	InputArray kernel,//结构元素
	Point anchor = Point(-1,-1),//结构元素的锚点位置
	int iterations = 1,//膨胀操作执行次数
	int borderType = BORDER_CONSTANT,//图像边缘处理方式
	const Scalar& borderValue = morphologyDefaultBorderValue()//处理边缘用的值
);

2.3.3.腐蚀

腐蚀操作的API参数基本和膨胀相同,不再赘述。

	
void erode( 
	InputArray src,
	OutputArray dst, 
	InputArray kernel,
	Point anchor = Point(-1,-1), 
	int iterations = 1,
	int borderType = BORDER_CONSTANT,
	const Scalar& borderValue = morphologyDefaultBorderValue() 
);

3.其他形态学操作

3.1.开操作与闭操作

3.1.1.开操作

开操作:先腐蚀后膨胀。

上图左为原图,右为执行开操作之后的图。

3.1.2.闭操作

闭操作:先膨胀后腐蚀。

上图左为原图,右为执行闭操作之后的图。

3.2.形态学梯度

形态学梯度:膨胀减去腐蚀。

上图左为原图,右为执行形态学梯度之后的图。

很明显,该操作可用于提取边缘。

3.3.顶帽与黑帽

3.3.1.顶帽

顶帽:原图像与开操作之间的差值图像(对应像素值差的绝对值)。

以3.1.1部分的原图作为例子,顶帽操作得到的图像见下:

3.3.2.黑帽

黑帽:原图像与闭操作之间的差值图像。

以3.1.2部分的原图作为例子,黑帽操作得到的图像见下:

3.4.相关API

void morphologyEx( 
	InputArray src,//原图像
	OutputArray dst,//输出图像
	int op,//形态学操作类型
	InputArray kernel,//结构元素,使用getStructuringElement构建
	Point anchor = Point(-1,-1),//锚点
	int iterations = 1,//操作执行次数
	int borderType = BORDER_CONSTANT,//边界处理方式
	const Scalar& borderValue = morphologyDefaultBorderValue()//处理边界时所使用的值
);

其中,参数int op有以下几种选择:

  1. MORPH_ERODE=0:腐蚀
  2. MORPH_DILATE=1:膨胀
  3. MORPH_OPEN=2:开操作
  4. MORPH_CLOSE=3:闭操作
  5. MORPH_GRADIENT=4:形态学梯度
  6. MORPH_TOPHAT=5:顶帽操作
  7. MORPH_BLACKHAT=6:黑帽操作
  8. MORPH_HITMISS=7

4.代码地址

C++实现

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
Mat src, dst;//设为全局变量,否则CallBack_Demo函数中无法使用
char winName[] = "output";
int element_size = 3;
int max_size = 21;
void CallBack_Demo(int, void*);//Trackbarcallback func的原型必须是这样!
int main(int argc, char**argv)
{
    src = imread("p1.png", -1);
    if (!src.data){
        printf("the image could not find...\n");
        return -1;
    }
    namedWindow("input image", WINDOW_AUTOSIZE);
    imshow("input image", src);

    namedWindow(winName, WINDOW_AUTOSIZE);
    //如果没有callback函数,就只有数值变化,即轨迹条可以正常滑动,数值可以正常随着滑块变化,但是图片不会变化
    //第三和第四个参数指的是运行callback函数的次数,本例中,callback函数运行几次就相当于dilate执行几次
    createTrackbar("Element Size", winName, &element_size, max_size, CallBack_Demo);
    CallBack_Demo(0, 0);
    //CallBack_Demo(1, &element_size);两个参数值随便设,好像并不会影响结果

    waitKey(0);
    return 0;
}

void CallBack_Demo(int, void*)
{
    int s = element_size * 2 + 1;
    Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
    //dilate(src, dst, structureElement, Point(-1, -1), 1);//kernel就是structureElement,1是迭代次数,迭代次数指的是对原图整体做几次膨胀操作,次数越多,图片越偏白
    erode(src, dst, structureElement);
    imshow(winName, dst);
}

Python实现

import cv2
import numpy as np

element_size = 3
max_size = 21

def callback_demo(val):
    global element_size
    element_size = val
    s = element_size * 2 + 1
    structure_element = cv2.getStructuringElement(cv2.MORPH_RECT, (s, s))
    dst = cv2.erode(src, structure_element)
    cv2.imshow("output", dst)

src = cv2.imread("p1.png", -1)
if src is None:
    print("The image could not be found...")
    exit()

cv2.imshow("input image", src)
cv2.namedWindow("output", cv2.WINDOW_AUTOSIZE)
cv2.createTrackbar("Element Size", "output", element_size, max_size, callback_demo)

callback_demo(element_size)  # Initial call to display the image
cv2.waitKey(0)
cv2.destroyAllWindows()

标签:src,MORPH,int,cv2,形态学,OpenCV,图像处理,操作,size
From: https://blog.csdn.net/matt45m/article/details/142991489

相关文章

  • 《OpenCV计算机视觉》—— 年龄与性别预测
    结合以下链接中的文章有助于理解此篇案例:OpenCV中的cnn模块https://blog.csdn.net/weixin_73504499/article/details/142965441?spm=1001.2014.3001.5501此案例是通过使用OpenCV中的cnn模块来调用别人已经训练好的深度学习模型,此篇案例中用到了人脸检测模型、年龄预测......
  • 2024年计算机视觉与图像处理国际学术会议 (CVIP 2024) 2024 International Conference
    文章目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus三、大会介绍2024年计算机视觉与图像处理国际学术会议(CVIP2024)将于2024......
  • labelImg操作麻烦,用opencv写了个假的,勉强能用
    LabelImage.py:1importcv22importos3importcopy4567defnoNagInt(array=[]):8newArray=[]9forsingleinarray:10ifsingle<0:11newArray.append(0)12else:13......
  • 【进阶OpenCV】 (17)-- Dlib库 --实现人脸检测
    文章目录Dlib库一、Dlib库安装二、实现人脸检测1.生成人脸检测器2.检测人脸3.显示人脸总结Dlib库Dlib提供了丰富的图像处理和计算机视觉工具,如面部特征检测、物体检测、图像变换等,这些工具使得开发者能够轻松地进行各种图像处理任务。一、Dlib库安装pipinst......
  • opencv yolo11 onnx c++代码
    1.exportonnx,opset我设置的是12,其它值或许也可以2.opencv使用的4.10【其他版本或许也可以,4.7.0版本是不行的】3.代码核心参考yolo之前版本的实现即可。 model.setInput(blob);model.forward(outputs,outnames);constintdimensions=84;constintrows=......
  • OpenCV基本操作(python开发)——(1) 读取图像、保存图像
    OpenCV一.OpenCV安装——linux执行以下命令安装opencv-python库(核心库)和opencv-contrib-python库(贡献库)。注意:命令拷贝后要合成一行执行,中间不要换行。#安装opencv核心库pip3install--useropencv-python==3.4.2.16--index-urlhttps://pypi.tuna.tsinghua.edu.cn......
  • C#图像处理与OCR:从验证码识别到文本提取 Tesseract实现验证码识别:本地化
    以下示例代码中,涉及到的知识点主要包括图像处理、验证码识别、Base64转换、图像预处理等。以下是详细的知识点梳理,以及相应的代码示例:1.图像加载与保存使用Image.FromFile加载本地图像,并使用Bitmap进行图像操作。Bitmap是图像处理的主要类,支持各种图像操作。代码......
  • OpenCV 简介与在 Python 和 C# 中的使用
    一、OpenCV概述(一)什么是OpenCVOpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉库,它提供了丰富的函数和工具,用于处理图像和视频数据。最初由英特尔公司开发,现在由一个开源社区维护和扩展。OpenCV支持多种操作系统,包括Windows、Linux和MacOS等,并且可......
  • 【北京迅为】itop-3562机器视觉opencv开发手册使用OpenCV处理图像
    iTOP-3562开发板采用瑞芯微RK3562处理器,主频2.0GHz,采用四核A53+MaliG52架构,主频2GHz,内置1TOPSNPU算力,具有多个嵌入式硬件引擎,以优化高端应用的性能。     【公众号】迅为电子----------------------------------------------------3.1颜色转换本小节代码在配套资料“iTOP-3......
  • 【北京迅为】itop-3562机器视觉opencv开发手册使用OpenCV处理图像
              iTOP-3562开发板采用瑞芯微RK3562处理器,主频2.0GHz,采用四核A53+MaliG52架构,主频2GHz,内置1TOPSNPU算力,具有多个嵌入式硬件引擎,以优化高端应用的性能。     【公众号】迅为电子----------------------------------------------------3.1颜色......