Opencv 이미지 처리-수학적 형태 연산

머리말

이 기사에서는 이미지 처리의 형태 학적 작동에 대해 설명합니다.


1. 수학적 형태 이미지 처리의 기본 개념

여기에 사진 설명 삽입

1.1 수학적 형태학 소개

       수학적 형태학은 격자 이론과 토폴로지를 기반으로 한 이미지 분석 과목이며 수학적 형태학 이미지 처리의 기본 이론입니다. 기본 작업에는 이진 부식 및 확장, 이진 열기 및 닫기 작업, 스켈레톤 추출, 제한 부식, 히트 앤 미스 변환, 형태 적 구배, 탑햇 변환, 입자 분석, 유역 변환, 회분 부식 및 확장, 회색 값 열기가 포함됩니다. 및 폐쇄 작업, 회색 값 형태 학적 그라디언트 등

1.2, 수학적 형태의 구성

       수학적 형태는 형태 학적 대수 연산자의 집합으로 구성 됩니다. 확장 (또는 확장), 부식 (또는 침식), 열기 및 닫기의 네 가지 기본 연산이 있습니다. 이진 이미지와 회색조 이미지에 있으며 각각 고유 한 특성이 있습니다. 이러한 기본 연산을 기반으로 다양한 수학적 형태 학적 실용적인 알고리즘을 도출하고 결합 할 수 있으며, 이미지 분할, 특징 추출, 에지 감지, 이미지 필터링, 이미지 향상 및 복원 등 이미지 모양과 구조를 분석하고 처리하는 데 사용할 수 있습니다. 수학적 형태학 방법은 이미지 정보를 수집하기 위해 구조적 요소라는 "프로브"를 사용합니다. 프로브가 이미지에서 지속적으로 움직일 때 이미지의 여러 부분 간의 관계를 조사하여 이미지의 구조적 특성을 이해할 수 있습니다. 수학적 형태는 인간 FOA (Focus Of Attention)의 시각적 특성과 유사한 감지 개념을 기반으로합니다. 프로브의 구조적 요소로서 이미지의 구조적 특성을 감지하고 연구하기 위해 지식 (모양, 크기, 회색 및 색도 정보)을 직접 전달할 수 있습니다.

1.3 수학적 형태론의 적용

       수학적 형태학의 기본 아이디어와 방법은 히트 / 미스 변환에 기반한 표적 인식, 유역 개념에 기반한 이미지 분할, 침식 및 개방 작업에 기반한 골격 추출, 이미지 코딩 등 이미지 처리와 관련된 모든 측면에 적용 할 수 있습니다. 압축, 측지 거리 기반 이미지 재구성, 형태 학적 필터 기반 입자 분석 등
수학적 형태는 엄격한 수학적 이론에 기초한 학문으로, 그 기본 아이디어와 방법은 이미지 처리 이론과 기술에 큰 영향을 미쳤습니다. 실제로 수학적 형태는 새로운 이미지 처리 방법 및 이론을 구성하고 컴퓨터 디지털 이미지 처리 및 프랙탈 이론의 중요한 연구 분야가되었으며 디지털 이미지 분석 및 처리 과정에 여러 분야에서 적용되었습니다. 이 과목은 컴퓨터 텍스트 인식, 컴퓨터 현미경 이미지 분석 (예 : 정량적 금속 조직 분석, 입자 분석), 의료 이미지 처리 (예 : 세포 감지, 심장 운동 과정 연구, 척추 암 이미지의 자동 정량 설명), 이미지 코딩 압축, 산업 검사 (예 : 식품 검사 및 인쇄 회로 자동 검사), 재료 과학, 로봇 비전, 자동차 움직임 모니터링 등은 모두 매우 성공적으로 적용되었습니다. 또한 수학적 형태 지문 감지, 경제 지리학, 합성 음악 및 단층 촬영 X 선 이미징 분야에서도 좋은 응용 가능성 가지고 있습니다 . 형태 학적 방법은 이미지 응용 분야의 엔지니어와 기술자에게 없어서는 안될 도구가되었습니다.

둘째, 이진 이미지

2.1. 의미

       이진 이미지는 각 픽셀이 검은 색 또는 흰색 인 이미지를 의미합니다. 이진 이미지는 일반적으로 캐릭터 이미지를 설명하는 데 사용됩니다. 장점은 공간을 덜 차지한다는 점입니다. 단점은 사람과 풍경 이미지를 표현할 때 이진 이미지는 가장자리 정보 만 표시 할 수 있고 이미지 내부의 질감 특징은 표시되지 않는다는 것입니다. 분명한. 이때 텍스처 기능이 풍부한 그레이 스케일 이미지를 사용해야합니다.

2.2. 샘플 바이너리 이미지

여기에 사진 설명 삽입

2.3. 이미지 이진화 처리 로직

       이미지 이진화 프로세스는 이미지에있는 점의 회색 값을 0 또는 255로 설정하는 것입니다. 즉, 전체 이미지에 명확한 흑백 효과를 제공합니다. 즉, 이미지의 전체적 특성과 국부적 특성을 그대로 반영 할 수있는 이진화 된 이미지를 얻기 위해 256 개의 밝기 레벨을 가진 그레이 스케일 이미지가 적절한 임계 값을 통해 선택됩니다. 디지털 이미지 처리에서 이진 이미지를 처리하고 분석하기 위해서는 먼저 회색조 이미지를 이진화하여 이진 이미지를 얻어야합니다. 이는 이미지의 추가 처리에 도움이되며 이미지의 집합 적 특성은 관련 픽셀 값이 0 또는 255 인 지점의 위치가 관련되고 픽셀의 다중 레벨 값이 더 이상 관련되지 않으므로 처리가 간단 해지고 데이터 처리 및 압축 량이 적습니다. 이상적인 이진 이미지를 얻기 위해 일반적으로 폐쇄 된 연결된 경계가 겹치지 않는 영역을 정의하는 데 사용됩니다. 그레이 스케일이 임계 값보다 크거나 같은 모든 픽셀은 특정 개체에 속하는 것으로 판단되며 해당 그레이 스케일 값은 255입니다. 그렇지 않으면 이러한 픽셀은 개체 영역에서 제외되고 그레이 스케일 값은 0으로 배경을 나타냅니다. 또는 예외적 인 물체 영역.


2.4, opencv 바이너리 처리 기능

2.4.1, threshold () 함수

소개 : 각 배열 요소에 고정 수준 임계 값을 적용하고 임계 값을 수동으로 지정하고이 임계 값을 이진화에 사용합니다.
함수 정의 :

double threshold( InputArray src, OutputArray dst, double thresh, double maxval, int type );
/*
src输入数组(多通道,8位或32位浮点),即图像。
dst输出数组的大小和类型与src的通道数相同。
thresh参数阈值。
maxval用于#THRESH_BINARY和#THRESH_BINARY_INV thresholding的最大值类型。
type如果使用大津法或三角形法,则返回计算出的阈值。
*/

2.4.2, adaptiveThreshold () 함수

소개 : 배열에 적응 형 임계 값을 적용하고 마지막 두 매개 변수를 설정하여 효과를 조정합니다.
기능 정의 :

void adaptiveThreshold( InputArray src, OutputArray dst, double maxValue, 
		int adaptiveMethod, int thresholdType, int blockSize, double C );
/*
src源8位单通道图像。
dst目标映像与src大小和类型相同的param 
maxValue指定给满足条件的像素的非零值
adaptiveMethod自适应阈值算法的使用#BORDER_REPLICATE |#BORDER_ISOLATED用于处理边界。
thresholdType Thresholding type必须是#THRESH_BINARY或#THRESH_BINARY_INV,
blockSize用于计算阈值的像素邻域的大小像素:3、5、7等等。
参数C常数从平均值或加权平均值中减去。正常情况下为正,但也可能为零或负。
*/

세, Opencv 이미지 기본 이진 연산

3.1. 부식 작업 : erode () 함수

소개 : 지정된 구조 요소를 사용하여 소스 이미지를 부식시킵니다. 구조 요소는 최소 픽셀 이웃의 모양을 결정합니다.
정의 :

void erode( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1,
            int borderType = BORDER_CONSTANT,  const Scalar& borderValue = morphologyDefaultBorderValue() );
/*
src:为输入图像对象通道数可以是任意的,但深度应该是CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
dst:输出与src大小和类型相同的图像。
kernel:用于扩展的内核结构元素;如果elemenat=Mat(),则为3 x 3矩形使用结构元素。
anchor:可以使用#getStructuringElement创建内核anchor元素中锚点的位置;默认值(-1,-1)表示锚点位于元素中心。
iterations:迭代次数应用腐蚀。
borderType:像素外推方法,不支持边框环绕。
borderValue:如果是常量border,则为border值
*/

3.2. 팽창 연산 : dilate () 함수

소개 : 지정된 구조 요소를 사용하여 소스 이미지를 확장하여 최대 값을 취하는 픽셀 이웃의 모양을 결정합니다.
정의 :

void dilate( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1,
             int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue() );
/*
src:为输入图像对象通道数可以是任意的,但深度应该是CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
dst:输出与src大小和类型相同的图像。
kernel:用于扩展的内核结构元素;如果elemenat=Mat(),则为3 x 3矩形使用结构元素。
anchor:可以使用#getStructuringElement创建内核anchor元素中锚点的位置;默认值(-1,-1)表示锚点位于元素中心。
iterations 迭代应用扩展的次数。
borderType:像素外推方法,不支持边框环绕。
borderValue:如果是常量border,则为border值
*/

3.3, morphologyEx () 함수

소개 : morphologyEx는 침식 및 확장을 사용하여 고급 형태 변환 기본 작업을 수행 할 수 있습니다. 모든 작업은 현장에서 수행 할 수 있습니다. 다중 채널 이미지의 경우 각 채널이 독립적으로 처리됩니다.
정의:

void morphologyEx( InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor = Point(-1,-1), 
				   int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue() );
/*
src:源图像。通道的数量可以是任意的。深度应该是CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
dst:目标映像的大小和类型与源映像相同。
Type:形态学运算的类型,请参见#MorphTypes
kernel:内核结构元素。可以使用#getStructuringElement创建它。
anchor :锚定与内核的锚定位置。负值表示锚点位于内核中心。
iterations :迭代应用腐蚀和膨胀的次数。
borderType:像素外推方法,请参见#BorderTypes。#不支持边框自动换行。
borderValue:如果是常量Border,则为Border值。默认值具有特殊的意思。
迭代次数是应用侵蚀或膨胀操作的次数。
例如,具有两次迭代的打开操作(#MORPH_OPEN)等价于apply
*/

3.3.1. 오픈 작업 : MORPH_OPEN

첫 번째 부식 및 팽창의 작동.
기능 : 작은 물체를 제거하고,가는 곳에서 물체를 분리하고, 큰 물체의 경계를 매끄럽게합니다.

3.3.2. 닫기 작업 : MORPH_CLOSE

첫 번째 팽창과 부식의 작동.
기능 : 개체의 작은 구멍을 채우고 인접한 개체를 연결하고 경계를 매끄럽게 만듭니다.

3.3.3, 그래디언트 연산 : MORPH_GRADIENT

이진 이미지에서이 작업을 수행하면 덩어리의 가장자리를 강조 할 수 있습니다.
역할 : 개체의 가장자리 윤곽을 유지하기위한 형태 학적 그라디언트

3.3.4 탑햇 운영 : MORPH_TOPHAT

원본 이미지에서 오픈 작업 후 이미지를 빼면 결과 이미지가 프로토 타입 외곽선 주변 영역보다 더 밝은 영역을 강조합니다
기능 : 인접한 패치보다 더 밝은 패치를 분리합니다.

3.3.5. 블랙 햇 운영 : MORPH_BLACKHAT

원본 이미지의 윤곽선 주변 영역보다 더 어두운 영역을 강조 표시
기능 : 주변 지점보다 더 어두운 패치를 분리 합니다.

3.4, getStructuringElement () 함수

소개 : 형태 학적 연산에 사용되는 지정된 크기 및 모양의 구조 요소를 반환합니다.
기능 : 일반적으로이 함수를 사용하여 이전 함수 정의의 매개 변수 커널과 협력하여 적합한 구조 요소를 구성합니다.
정의 :

Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
/*
shape:元素可以是#MorphShapes之一的形状
ksize:结构元素的大小。
anchor:锚定元素内的锚定位置。默认值\f$(-1,-1)\f$表示锚在中间。只有十字形元素的形状取决于锚点位置。在其他情况下,锚定只会调节结果的大小操作转移。
*/

3.5, createTrackbar () 함수

소개 : createTrackbar 함수는 지정된 이름의 트랙 바 (슬라이더 또는 범위 제어) 및 범위를 생성하고, 트랙 바와 동기화 된 위치로 변수 값을 지정하고, 트랙의 위치가 호출 될 때 호출 될 콜백 함수 onChange를 지정합니다. 바 변경. 생성 된 트랙 바가 지정된 창에 표시됩니다.
정의:

int createTrackbar(const String& trackbarname, const String& winname, int* value, 
					int count,TrackbarCallback onChange = 0,void* userdata = 0);
/*
trackbarname:创建的轨迹栏的名称。
winname:将用作所创建轨迹栏父级的窗口的名称。
value:指向整数变量的可选指针,该整数变量的值反映滑块。创建时,滑块位置由该变量定义。
count:滑块的最大位置。最小位置总是0。
onChange:指向每次滑块改变位置时要调用的函数的指针。这个函数的原型应该是void Foo(int,void\*);其中第一个参数是trackbar位置,第二个参数是用户数据(见下一个参数)。如果回调是空指针,不调用回调,但只更新值。
userdata:按原样传递给回调的用户数据。它可以用来处理轨迹栏不使用全局变量的事件。
*/ 

3.6 형태 학적 연산 유형의 열거 :

enum MorphTypes{
    
    
    MORPH_ERODE    = 0, //!< see #erode
    MORPH_DILATE   = 1, //!< see #dilate
    MORPH_OPEN     = 2, //!< an opening operation
    MORPH_CLOSE    = 3, //!< a closing operation
    MORPH_GRADIENT = 4, //!< a morphological gradient
    MORPH_TOPHAT   = 5, //!< "top hat"
    MORPH_BLACKHAT = 6, //!< "black hat"
    MORPH_HITMISS  = 7  //!< "hit or miss"
};

네, 코드 데모 :

4.1 부식 및 팽창

코드 블록

//腐蚀与膨胀
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

Mat src, dst;
int element_size = 2;
int max_size = 20;
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));//膨胀
	
	//erode(src, dst, structureElement);//腐蚀
	imshow("output_image", dst);
}
int main() {
    
    
	src = imread("D:\\Myfile\\素材照片\\opencv素材照片\\4.jpg");
	if (!src.data) {
    
    
		cout << "could not load image..." << endl;
		return 0;
	}
	namedWindow("input_image", WINDOW_AUTOSIZE);
	imshow("input_image", src);
	namedWindow("output_image", WINDOW_AUTOSIZE);
	createTrackbar("Element Size :", "output_image", &element_size, max_size, CallBack_Demo);
	CallBack_Demo(0, 0);
	imshow("output_image", dst);

	waitKey(0);
	return 0;
}

작업 결과 :
여기에 사진 설명 삽입

4.2, 열기, 닫기, 그라디언트, 모자, 검은 모자 및 기타 작업

코드 블록 :

//形态学操作
#include <opencv2/opencv.hpp>
#include <iostream>
#include "facedetectcnn.h"

using namespace std;
using namespace cv;
int main() {
    
    
	Mat src, dst;
	src = imread("D:\\Myfile\\素材照片\\opencv素材照片\\11.jpg");
	if (!src.data) {
    
    
		cout << "could not load image..." << endl;
		return 0;
	}
	namedWindow("input_image", WINDOW_AUTOSIZE);
	imshow("input_image", src);
	
	//Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));//结构元素
	//morphologyEx(src, dst, MORPH_OPEN, kernel);//开操作,先腐蚀后膨胀
	//morphologyEx(src, dst, MORPH_CLOSE, kernel);//闭操作,先膨胀后腐蚀

	//梯度:膨胀减去腐蚀,基本梯度(内部梯度,方向梯度)
	//morphologyEx(src, dst, MORPH_GRADIENT, kernel);

	//顶帽 原图像和开操作图像
	//morphologyEx(src, dst, MORPH_TOPHAT, kernel);

	//黑帽 原图像和闭操作图像
	//morphologyEx(src, dst, MORPH_BLACKHAT, kernel);

	//提取水平和垂直线
	cvtColor(src, dst, COLOR_BGR2GRAY);
	Mat Bin_dst;
	adaptiveThreshold(dst, Bin_dst, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);//二值化图像
	Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
	Mat vline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));
	Mat kernels = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	//Mat temp;
	//erode(Bin_dst, temp, kernels);
	//dilate(temp, dst, kernels);
	morphologyEx(Bin_dst, dst, MORPH_OPEN, hline);
	bitwise_not(dst, dst);
	blur(dst, dst, Size(3, 3), Point(-1, -1));
	namedWindow("output_image", WINDOW_AUTOSIZE);
	imshow("output_image", dst);
	waitKey(0);
	return 0;
}

작업 결과 :
여기에 사진 설명 삽입

요약하자면

이 기사에서는 부식, 팽창, 열기, 닫기, 구배, 모자, 검은 모자와 같은 수학적 형태 연산에 대해 설명합니다.

참조 소스

질문이 있으시면 메시지를 남겨주세요!
오류가 있으면 수정 해주세요!

추천

출처blog.csdn.net/ivan_9/article/details/113935721