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 의 단일 채널 그림 입 니 다
  • labels:2 차원 태그 배열(이산 Voronoi 그림)은 입력 이미지 와 같은 크기 를 가지 고 데이터 형식 은 CV 입 니 다.32S 의 단일 채널 데이터..
  • 4.567917.distance Type:두 픽 셀 사이 의 거 리 를 계산 하 는 방법 을 선택 한 표 지 는 자주 사용 하 는 거리 측정 방법 은 표 6-1 에 제시 합 니 다
  • maskSize:거리 변환 마스크 행렬 의 크기,매개 변수 가 선택 할 수 있 는 사 이 즈 는 DISTMASK_3(3×3)와 DISTMASK_5(5×5).
  • 4.567917.label Type:구축 할 태그 배열 의 유형,선택 할 수 있 는 매개 변 수 는 표 에 있 습 니 다. 
    4.567917.이 함 수 는 이미지 의 거리 변환,즉 이미지 의 모든 픽 셀 거리 0 픽 셀 의 최소 거 리 를 통계 하 는 데 사 용 됩 니 다
  • 함수 의 첫 번 째 매개 변 수 는 거리 변환 을 기다 리 는 입력 이미지 입 니 다.입력 이미지 요 구 는 반드시 CV 여야 합 니 다.8U 의 단일 채널 그림 입 니 다
  • 4.567917.함수 의 두 번 째 매개 변 수 는 원 이미지 거리 가 변 경 된 출력 이미지 로 입력 이미지 와 같은 사 이 즈 를 가지 고 있 으 며,이미지 의 모든 픽 셀 값 은 이 픽 셀 이 원 이미지 에서 0 픽 셀 의 최소 거 리 를 나타 낸다.그림 의 크기 가 256 보다 클 수 있 기 때문에 그림 의 한 픽 셀 거리 0 픽 셀 의 가장 가 까 운 거 리 는 255 보다 클 수 있 습 니 다.각 픽 셀 거리 0 픽 셀 의 최소 거 리 를 정확하게 통계 하기 위해 출력 이미지 의 데이터 형식 은 CV 를 선택 할 수 있 습 니 다.8U 혹은 CV32F。
  • 함수 세 번 째 매개 변 수 는 원래 이미지 의 Voronoi 그림 이 고 출력 이미 지 는 데이터 형식 은 CV 입 니 다.32S 단일 채널 그림,그림 크기 는 입력 그림 과 같 습 니 다
  • 함수 네 번 째 매개 변 수 는 거리 변환 과정 에서 사용 하 는 거리 종류 이 고 자주 사용 하 는 거 리 는 유럽식 거리(DISTL2)、거리(DISTL1)와 바둑판 거리(DISTC)。
  • 4.567917.함수 다섯 번 째 매개 변 수 는 경 로 를 구 할 때의 마스크 사이즈 이다.이 사 이 즈 는 선택 한 거리 종류 와 밀접 한 관 계 를 가진다.거리 거 리 를 선택 할 때 마스크 사 이 즈 는 3 을 선택한다.×3 아니면 5?×5.계산 결과 에 영향 을 주지 않 기 때문에 함수 연산 속 도 를 높이 기 위해 기본적으로 마스크 사 이 즈 를 3 으로 선택 합 니 다.×3;유럽식 거 리 를 선택 할 때 마스크 사 이 즈 는 3 이다.×3 시 는 두 픽 셀 사이 의 거 리 를 대충 계산 하고 마스크 크기 는 5 이다.×5 시 는 두 픽 셀 사이 의 거 리 를 정확하게 계산 하고 정확 한 계산 과 대략적인 계산 사이 에 비교적 큰 차이 가 존재 하기 때문에 유럽식 거 리 를 사용 할 때 5 를 추천 합 니 다.×5 마스크;바둑판 거 리 를 선택 할 때 마스크 의 사 이 즈 는 계산 결과 에 도 영향 을 주지 않 기 때문에 마음대로 선택 할 수 있다
  • 함수 의 마지막 매개 변 수 는 라벨 배열 을 구축 하 는 형식 입 니 다.label TypeDISTLABEL_CCOMP 시 이 함 수 는 입력 이미지 에서 0 픽 셀 의 연결 분량 을 자동 으로 찾 아 다른 태그 로 표시 합 니 다.labelTypeDISTLABEL_CCOMP 시 이 함 수 는 입력 한 그림 을 스 캔 하고 0 픽 셀 을 다른 태그 로 표시 합 니 다.
  • 이 함수 의 원형 은 그림 을 거리 변환 하 는 동시에 Voronoi 그림 을 생 성 합 니 다.그러나 가끔 은 그림 에 대한 거리 변환 을 실현 하기 위해 Voronoi 그림 을 사용 하지 않 아 도 됩 니 다.이 함 수 를 사용 하려 면 Mat 류 변 수 를 만들어 서 Voronoi 그림 을 저장 하고 내부 자원 을 차지 해 야 합 니 다.따라서 distance Transform()함수 의 두 번 째 함수 원형 에 서 는 Voronoi 그림 생 성 을 취소 하고 거리 가 변 경 된 그림 만 출력 합 니 다.
    
    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 에 제시 합 니 다
  • maskSize:거리 변환 마스크 행렬 의 크기,매개 변수 가 선택 할 수 있 는 사 이 즈 는 DISTMASK_3(3×3)와 DISTMASK_5(5×5)。
  • dst Type:그림 을 출력 하 는 데이터 형식 으로 CV 일 수 있 습 니 다.8U 혹은 CV32F。
    이 함수 원형 중의 주요 매개 변수 의 미 는 앞의 함수 원형 과 같 고 앞의 두 매개 변 수 는 입력 이미지 와 출력 이미지 이 며 세 번 째 매개 변수 와 거리 변환 과정 에서 사용 하 는 거리 종류 입 니 다.함수 에서 네 번 째 매개 변 수 는 거리 변환 마스크 행렬 의 크기 입 니 다.거리 거리(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;
    }
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기