형태 학적 연구는 -opencv- 노트

면책 조항 :이 문서는 블로거 원본입니다, 추적 에 의해-SA의 CC 4.0 저작권 계약, 복제, 원본 소스 링크이 문을 첨부 해주세요.
이 링크 : https://blog.csdn.net/aaron1996123456/article/details/102742941

형태 학적 연구는 -opencv- 노트

일반적인 형태 작업 포함 팽창 부식의 가장 기본적인 방법이고 침식, 팽창, 개방 동작 및 폐쇄 동작 탑 햇 운전 동작 다른 하단 캡.

부식

분석 원리

화상의 부식 근방 위치의 최소 출력값 각 시트 위치에 대해 선택된다. 이웃 구성 십자 직사각형 구조 일 수있는 타원형의 구조 일 수있다, 구성 요소의 대부분이 정의된다.

각각의 이웃에 대한 최소값을 선택하면, 화상의 밝기는 화상 영역의 밝은 영역이 감소하거나 사라지게되며, 부식을 감소시킬 것이다. 이미지 는 I , 구조 요소 S 에칭 동작은 함 :
이자형 = 나는 에스 E = I⊝S
밝기 감소 에칭 작업 영역의 화상 영역은,에 의해,도 전경에 대한 임계 후 이진 랜덤 백색 나는 - 이자형 IE 작업은 경계를 추출한다.

구현 코드

화상 부식 OpenCV의 기능을 제공한다 :

erode(src, element[,dst[,iterations[,borderType[,borderValue]]]])
    //src			输入矩阵
    //element		结构元
    //anchor		结构元的锚点
    //iterations	迭代的次数
    //borderType	边界扩充类型
    //borderValue	边界扩充值

경계 중의 경우, 필요가 이미지의 경계, 가장 좋은 방법은 거울을 확장합니다. 구성 요소 파라미터 요소가 OpenCV의 함수를 제공 의미 :

getStructuringElement(shape, ksize[,anchor])
    //shape			MORPH_RECT:产生矩形结构元
    //				MORPH_ELLIPSEM:产生椭圆结构元
    //				MORPH_CROSS:产生十字交叉结构元
    //ksize			结构元尺寸
    //anchor		结构元锚点

부식 및 에칭 조작하여 GetStrcturingElement 함수 :

if __name__ =='__main__':
	#loading image
	image=cv2.imread("G:\\blog\\OpenCV_picture\\chapter6\\img7.jpg",cv2.IMREAD_GRAYSCALE)
	cv2.imshow("image",image)
	#Entropy threshold
	thresh,out=threshEntroy(image)

	#show thresh
	print(thresh)
	out=np.round(out)
	out.astype(np.uint8)

	#erode
	#create element
	element = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
	#erode image, iterations set 1
	erodeImg = cv2.erode(out, element)
	#border extraction
	bordeExtractionImg = out - erodeImg

	cv2.imshow("out",out)
	cv2.imshow("erodeImage", erodeImg)
	cv2.imshow("border extraction image", bordeExtractionImg)
	cv2.waitKey(0)
	cv2.destroyAllWindows()

결과 :

[이미지 소스 스테이션 보안 체인 메커니즘을 가질 수있다, 체인이 실패 덤프, 그것은 아래로 직접 업로드 한 사진을 저장하는 것이 좋습니다 (IMG-7h40f80j-1571986151633) (C : \ 사용자 \ huangxin 바탕 화면 \ 아핀 변환 \의 OpenCV의 알고리즘 \ 간결 -7 \ 1.png)]

C ++ 에칭 공정 :

	//创建结构元
	Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
	
	//进行2次腐蚀操作
	Mat erodeImage1, erodeImage2;
	erode(OtsuMat, erodeImage1, element, Point(-1, -1), 2);
	erode(threshByEntroyMat, erodeImage2, element, Point(-1, -1), 2);
	
	//显示图片
	imshow("src", src);
	imshow("dst", thresh_out_dst);
	imshow("threshByEntroy", threshByEntroyMat);
	imshow("Otsu", OtsuMat);
	imshow("erode after Otsu", erodeImage1);
	imshow("erode after threshByEntroy", erodeImage2);

결과 :

[이미지 소스 스테이션 보안 체인 메커니즘을 가질 수있다, 체인이 실패 덤프, 그것은 아래로 직접 업로드 한 사진을 저장하는 것이 좋습니다 (IMG-y6V1KLkY-1571986151634) (C : \ 사용자 \ huangxin \ 바탕 화면 \ 아핀 변환 \의 OpenCV의 알고리즘 간결 -7 \ 2.png)]

구조 요소의 크기가 대상물의 화이트 영역이 작고, 증가, 에칭 동작이 반복되고, 백색 영역은 작아 질 것이다.

팽창

부식은 유사하지만, 이웃의 최대 값이 팽창 한 후, 밝은 영역이 증가 될 이미지의 밝기를 증가 획득된다. 화상 I 및 구조 요소 S의 팽창 동작이라고 함 :
= 나는 에스 D = I⊕S

코드 구현

open'c'v 제공되는 팽창 함수 ()

dilate(src, element[,dst[,iterations[,borderType[,borderValue]]]])
//src			输入矩阵
//element		结构元
//anchor		结构元的锚点
//iterations	迭代的次数
//borderType	边界扩充类型
//borderValue	边界扩充值
if __name__=="__main__":
	image=cv2.imread("G:\\blog\\OpenCV_picture\\chapter6\\img7.jpg",cv2.IMREAD_GRAYSCALE)
	cv2.imshow("init iamge", image)

	#结构元半径,迭代次数
	radius, iterationsNum = 1, 1
	MAX_R, MAX_Iter = 20, 20
	
	#显示膨胀窗口
	cv2.namedWindow("dilate", 1)

	def nothing(*arg):
		pass

	#调节结构圆半径
	cv2.createTrackbar("radius", "dilate", radius, MAX_R, nothing)
	cv2.createTrackbar("iterations", "dilate", iterationsNum, MAX_Iter, nothing)
	while True:

		#获得当前的半径值
		radius = cv2.getTrackbarPos("radius", 'dilate')
		iterationsNum = cv2.getTrackbarPos("iterations", "dilate")
		#创建结构元
		element = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2*radius+1, 2*radius+1))

		#膨胀图像
		dilateImg = cv2.dilate(image, element, iterations=iterationsNum)

		#显示膨胀效果
		cv2.imshow("dilate", dilateImg)
		ch = cv2.waitKey(5)
		
		#按下Esc键退出
		if ch ==  27:
			break
	cv2.destroyAllWindows()

"S = cv2.getStructuringElement (cv2.MORPH_OPEN (2 코드에 해당 유의 R & LT 1,2- + . R & LT + 1))의"오류 cv2.cv2.MORPH_ELLIPSE 설명한다하는 다른 프로그램이 표시되는 "오류 : anchor.inside ((-215가 어설 션 실패) 함수를 사각형 (0, 0, ksize.width, ksize.height)) 'CV : normalizeAnchor'

문제가 while 루프 내 cv2.destroyAllWindows ()는 반경 값을 일으키는 원인이 내부 쓰고 다시 반복을 얻을 수 없기 때문에 곳을 찾을 수 있습니다.

이 크기가 커야 또는 오류 것보다 3 * 3의 소자의 최소 크기,

int radius = 1;
int MAX_R = 20;
Mat image, outImg;


//回调函数,调节半径
void callBack(int, void *)
{
	//创建只有垂直方向上的矩形结构元
	Mat element = getStructuringElement(MORPH_RECT, Size(1, 2 * radius + 1));

	dilate(image, outImg, element);

	imshow("dilate", outImg);
	
}

int main()
{

	//输入图像
	std::string imagePath = "G:\\blog\\OpenCV_picture\\chapter6\\img7.jpg";
	Mat src = imread(imagePath, 0);
	
	if (!src.data)
	{
		std::cout << "load image error!" << std::endl;
		return -1;
	}

	Mat thresh_out_dst;
	int ret = 0;

	ret = threshTwoPeaks(src, thresh_out_dst);
	if (!ret)
	{
		return -1;
	}
	cout << ret << endl;


	Mat threshByEntroyMat;
	ret = threshByEntroy(src, threshByEntroyMat);
	if (!ret)
	{
		return -1;
	}
	cout << ret << endl;

	
	Mat OtsuMat;
	ret = Otsu(src, OtsuMat);
	if (!ret)
	{
		return -1;
	}
	cout << ret << endl;

	imshow("Otsu", OtsuMat);
	waitKey(0);
	OtsuMat.copyTo(image);
	//image=OtsuMat.clone();
	imshow("img", image);
	namedWindow("dilate", WINDOW_AUTOSIZE);
	createTrackbar("radius", "dilate", &radius, MAX_R, callBack);
	callBack(0, 0);

	waitKey(0);


	return 0;
}

결과 :

[이미지 소스 스테이션 보안 체인 메커니즘을 가질 수있다, 체인이 실패 덤프, 그것은 아래로 직접 업로드 한 사진을 저장하는 것이 좋습니다 (IMG-Jilr78rT-1571986151636) (C : \ 사용자 \ huangxin \ 바탕 화면 \ 아핀 변환 \의 OpenCV의 알고리즘 간결 -7 \ 4.png)]

OstuMat Ostu 화상 임계 획득 여기서 전술이다.

개폐 동작

개방형 동작 부식 동안 팽창한다.

작은 영역에서 높은 휘도를 제거 얇은 지점에서 분리 객체는 큰 객체에 대해 원활하게 공간 등의 경우에는 눈에 띄지 경계를 변경할 수있다.

개폐 동작은 제 1 팽창을 에칭에 의해 수행된다.

이것은 공진 영역 내의 블랙 미세한 흰 물체로 충전 될 수 있고, 접속 대상물, 동일한 구성 요소들에 인접하는 복수의 처리는 경계 크게 등의 부드러운 영역을 변경하고, 경우 일 수있다.

OpenCV의 함수 norphologyEx () 함수를 제공한다

norphologyEx(src, op, element[,dst[, anchor[iterations[,borderType[,borderValue]]]]])
//src			输入矩阵
//op			形态学处理的各种运算
//				NORPH_OPEN		开运算
//				NORPH_CLOSE		闭运算
//				NORPH_GRADIENT	形态梯度
//				NORPH_TOPHAT	顶帽运算
//				NORPH_BLACKHAT	底帽运算
//element		结构元
//iterations	迭代次数
//anchor		结构元锚点
if __name__ == "__main__":
	image = cv2.imread("G:\\blog\\OpenCV_picture\\chapter7\\img1.jpg", 0)
	cv2.imshow("InitImage", image)

	#结构元半径
	radius, iter = 1, 1
	MAX_R, MAX_Iter = 20, 20

	#
	cv2.namedWindow("morphology", 1)
	def nothing(*arg):
		pass

	cv2.createTrackbar("radius", "morphology", radius, MAX_R, nothing)
	cv2.createTrackbar("iterations", "morphology", iter, MAX_Iter, nothing)

	while True:
		radius = cv2.getTrackbarPos("radius", "morphology")
		iter = cv2.getTrackbarPos("iterations", "morphology")

		element = cv2.getStructuringElement(cv2.MORPH_RECT,(2*radius+1, 2*radius +1))

		photoMorphology = cv2.morphologyEx(image, cv2.MORPH_OPEN,element,iterations=iter)

		cv2.imshow("morphology", photoMorphology)
		
		ch = cv2.waitKey(5)
		if ch  == 27:
			break

	cv2.destroyAllWindows()

\ 사용자 \ huangxin 바탕 화면 \ 아핀 변환 \의 OpenCV의 알고리즘 \ 간결 : 영업 실적은 [그림 체인이 실패 외부 소스 스테이션은 보안 체인 메커니즘을 가질 수있다 덤프, (IMG-vBQSaH8w-1571986151637) (C 바로 아래로 업로드 한 사진을 저장하는 것이 좋습니다 -7 \ 5.png)]

작업을 열면 어두운 배경의 밝은 영역은, 지역의 경우 크게 변경되지 않습니다 밝은 흰색 영역을 제거 할 수 없습니다. 동작을 종료하면 밝은 장소에서 어두운 영역을 제거하는 것이다

모자 변환

탑햇의 이미지를 정의하는 개구부 감산 연산의 결과로 변환

열기 운영자는 어두운 배경에 밝은 영역을 제거 할 수 있습니다. 그림 방식 개방 조작 밝은 회색 영역의 긍정적 효과 불균일 한 조명을 뺀. 또한 흰색 모자로 알려진 변환

하단 모자 변환

폐쇄를 감산하는 화상 연산 결과를 정의하는 엔드 캡

개방형 동작은 어두운 영역 밝은 배경에서 제거 될 수있다. 회색 영역 어두운 개방 조작 방법을 감산 한 화상은 블랙 모자라고도 변환

형태 학적 그라데이션

형태학 구배 팽창 부식의 결과를 감산에 의해 정의되며, 확장 지역 최대 값, 비 부식성의 최소값은, 높은 휘도가 저휘 오브젝트 경계를 감산함으로써 얻어진다.

연산의 수정 된 값을 제공 MorphologyEx OpenCV의 기능은 상부 캡, 하부 캡 동작 기울기 형태를 얻을 수있다

//输入图像
Mat I;
//输出图像
Mat d;
//结构元
Mat element;
string window = "形态学处理";
//结构元半径
int r = 1;
int MAX_R = 20;
//迭代次数
int i = 1;
int MAX_I = 20;
//回调函数,调节r和i
void callBack(int, void*)
{
	//创建结构元
	element = getStructuringElement(MORPH_RECT, Size(2 * r + 1, 2 * r + 1));
	//形态学处理
	morphologyEx(I, d, cv::MORPH_TOPHAT, element, Point(-1, -1), i);
	//显示形态处理的效果
	imshow(window, d);
}
int main(int argc, char*argv[])
{
	//输入图像
	I = imread("G:\\blog\\OpenCV_picture\\chapter7\\open.jpg", 0);
	if (!I.data)
		return 0;
	//显示原图
	imshow("原图", I);
	//创建显示形态学结果显示窗口
	namedWindow(window, 1);
	//创建调节r的进度条
	createTrackbar("半径", window, &r, MAX_R, callBack);
	//创建调节i的进度条
	createTrackbar("迭代次数", window, &i, MAX_I, callBack);
	callBack(0, 0);
	waitKey(0);
	return 0;
}

실행 사진 :

{
// 입력 이미지
는 I = imread ( "G : \ 블로그 \ OpenCV_picture \ 7 장 \ open.jpg", 0);
IF (! I.Data)
반환 0;
// 디스플레이 사진
imshow ( "작품"내가 )
// 표시창이 형태의 결과 표시 작성
namedWindow (창 ,. 1);
// R에서의 진행 바 조정 생성
createTrackbar ( "반경"창, R을 MAX_R, 콜백);
// i가 조절의 진행 바를 생성
createTrackbar을 ( "반복", 창 & I, MAX_I, 콜백),
콜백 (0, 0);
waitKey (0);
0 반환;
}


运行图片:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qG5oqqdk-1571986151638)(C:\Users\huangxin\Desktop\仿射变换\opencv算法精讲-7\6.png)]

추천

출처blog.csdn.net/aaron1996123456/article/details/102742941