형태 학적 연구는 -opencv- 노트
일반적인 형태 작업 포함 팽창 부식의 가장 기본적인 방법이고 침식, 팽창, 개방 동작 및 폐쇄 동작 탑 햇 운전 동작 다른 하단 캡.
부식
분석 원리
화상의 부식 근방 위치의 최소 출력값 각 시트 위치에 대해 선택된다. 이웃 구성 십자 직사각형 구조 일 수있는 타원형의 구조 일 수있다, 구성 요소의 대부분이 정의된다.
각각의 이웃에 대한 최소값을 선택하면, 화상의 밝기는 화상 영역의 밝은 영역이 감소하거나 사라지게되며, 부식을 감소시킬 것이다. 이미지 는 I , 구조 요소 S 에칭 동작은 함 :
밝기 감소 에칭 작업 영역의 화상 영역은,에 의해,도 전경에 대한 임계 후 이진 랜덤 백색
작업은 경계를 추출한다.
구현 코드
화상 부식 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의 팽창 동작이라고 함 :
코드 구현
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)]