OpenCV 이미지 거리 변환 실현
유럽식 거리 약
거리
두 픽 셀 점 X 방향 과 Y 방향의 거리의 합.유럽식 거 리 는 한 픽 셀 점 에서 다른 픽 셀 점 까지 의 가장 짧 은 거 리 를 나타 낸다.그러나 때때로 우 리 는 두 점 사이 의 연결선 방향 으로 전진 할 수 없다.예 를 들 어 한 도시 내 두 점 사이 의 연결선 에 장애물 이 존재 할 수 있 기 때문에 한 점 에서 다른 점 까지 거 리 를 따라 걸 어야 하기 때문에 이런 거리의 도량형 방식 은 거리 거리 거리 라 고 불 린 다.거리 거 리 는 하나의 픽 셀 점 에서 다른 픽 셀 점 까지 X 방향 과 Y 방향 을 따라 모두 걸 어야 하 는 거리 로 수학 적 표현 형식 은 다음 과 같다.
바둑판 거리
두 픽 셀 점 X 방향 거리 와 Y 방향 거리의 최대 값.거리 와 비슷 하고 바둑판 거리 도 두 픽 셀 점 사이 에 연결선 방향 으로 접근 할 수 없다 고 가정 한다.픽 셀 점 은 X 방향 과 Y 방향 으로 만 이동 할 수 있다.그러나 바둑판 거 리 는 한 픽 셀 점 에서 다른 픽 셀 점 사이 로 이동 하 는 거 리 를 나타 내 는 것 이 아니 라 두 픽 셀 점 이 같은 줄 이나 같은 열 로 이동 할 때 이동 해 야 하 는 최대 거 리 를 나타 낸다.수학 표현 형식 은 식 과 같다.
CV_EXPORTS_AS(distanceTransformWithLabels) void distanceTransform( InputArray src, OutputArray dst,
OutputArray labels, int distanceType, int maskSize,
int labelType = DIST_LABEL_CCOMP );
src:그림 을 입력 하 십시오.데이터 형식 은 CV 입 니 다.8U 의 단일 채널 이미지dst:출력 이미지,입력 이미지 와 같은 크기,데이터 형식 은 CV8U 혹은 CV32F 의 단일 채널 그림 입 니 다 4.567917.이 함 수 는 이미지 의 거리 변환,즉 이미지 의 모든 픽 셀 거리 0 픽 셀 의 최소 거 리 를 통계 하 는 데 사 용 됩 니 다
void distanceTransform( InputArray src, OutputArray dst,
int distanceType, int maskSize, int dstType=CV_32F);
src:그림 을 입력 하 십시오.데이터 형식 은 CV 입 니 다.8U 의 단일 채널 이미지dst:출력 이미지,입력 이미지 와 같은 크기,데이터 형식 은 CV8U 혹은 CV32F 의 단일 채널 그림 입 니 다4.567917.distance Type:두 픽 셀 사이 의 거 리 를 계산 하 는 방법 을 선택 한 표 지 는 자주 사용 하 는 거리 측정 방법 은 표 6-1 에 제시 합 니 다 이 함수 원형 중의 주요 매개 변수 의 미 는 앞의 함수 원형 과 같 고 앞의 두 매개 변 수 는 입력 이미지 와 출력 이미지 이 며 세 번 째 매개 변수 와 거리 변환 과정 에서 사용 하 는 거리 종류 입 니 다.함수 에서 네 번 째 매개 변 수 는 거리 변환 마스크 행렬 의 크기 입 니 다.거리 거리(DistL1)와 바둑판 거리(DistC)마스크 사이즈 에 대한 요구 가 없 기 때문에 이 매개 변 수 는 거리 거리 와 바둑판 거 리 를 선택 할 때 3 으로 강제 설정 되 고 똑 같이 마스크 사이즈 의 크기 는 유럽식 거리(DistL2)계산의 정밀도 에 영향 을 미 치 므 로 비교적 정확 한 것 을 얻 기 위해 보통 5 를 사용한다.×5 의 마스크 행렬.함수 의 마지막 매개 변 수 는 그림 을 출력 하 는 데이터 형식 입 니 다.CV 에 있 지만8U 와 CV32F 두 가지 유형 중에서 임의로 선택 하지만 이미지 출력 시 실제 데이터 형식 은 거리 변환 시 선택 한 거리 종류 와 밀접 한 관 계 를 가진다.CV8U 는 거리 거 리 를 계산 하 는 조건 에서 만 사용 할 수 있 으 며,유럽식 거리 와 바둑판 거 리 를 계산 할 때 이 매개 변 수 를 CV 로 설정 하 더 라 도8U,실제 출력 이미지 의 데이터 형식 도 CV32F。
단순 예시
//
// Created by smallflyfly on 2021/6/15.
//
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include "utils.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int main() {
//
Mat a = (Mat_<uchar>(5, 5) <<
1,1,1,1,1,
1,1,1,1,1,
1,1,0,1,1,
1,1,1,1,1,
1,1,1,1,1
);
Mat distL1, distL2, distC;
distanceTransform(a, distL1, DIST_L1, 3, CV_8U);
distanceTransform(a, distL2, DIST_L2, 5, CV_8U);
distanceTransform(a, distC, DIST_C, 3, CV_8U);
cout << distL1 << endl;
cout << distL2 << endl;
cout << distC << endl;
Mat im = imread("test.jpg", IMREAD_GRAYSCALE);
if (im.empty()) {
cerr << "image file read error" << endl;
return -1;
}
resize(im, im, Size(0, 0), 0.5, 0.5);
//
Mat im1, im2;
threshold(im, im1, 125 ,255, THRESH_BINARY);
threshold(im, im2, 125, 255, THRESH_BINARY_INV);
Mat dist1, dist2;
distanceTransform(im1, dist1, DIST_L1, 3, CV_32F);
distanceTransform(im2, dist2, DIST_L1, 3, CV_8U);
showImage("im1", im1);
showImage("dist1", dist1);
showImage("im2", im2);
showImage("dist2", dist2);
waitKey(0);
destroyAllWindows();
return 0;
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Visual Studio 2017에서 OpenCV 템플릿 프로젝트 만들기・Windows 7 Professional 64bit ・Visual Studio 2017 Version 15.9.14 · OpenCV 3.4.1 OpenCV의 도입 방법 등은 아래를 참조하십시오. Visual Stu...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.