OpenCV 이미지 연결 영역 구현

이미지 의 연결 도 메 인 은 이미지 에 같은 픽 셀 값 을 가지 고 위치 가 인접 한 픽 셀 로 구 성 된 구역 을 말 합 니 다.연결 도 메 인 분석 은 이미지 에서 서로 독립 된 연결 도 메 인 을 찾 아 표시 하 는 것 을 말 합 니 다.
일반적인 상황 에서 하나의 연결 도 메 인 에는 하나의 픽 셀 값 만 포함 되 어 있 기 때문에 픽 셀 값 변동 이 서로 다른 연결 도 메 인 추출 에 미 치 는 영향 을 방지 하기 위해 연결 도 메 인 분석 은 항상 이치 화 된 이미지 입 니 다.
4-인접 지역 과 8-인접 지역:

자주 사용 하 는 이미지 인접 도 메 인 분석 법 은 두 번 의 스 캔 법 과 피 드 충전 법 이 있다.두 번 의 스 캔 법 은 두 번 의 그림 을 옮 겨 다 닙 니 다.첫 번 째 그림 을 옮 겨 다 닐 때 0 픽 셀 이 아 닌 모든 숫자 라벨 을 부여 합 니 다.특정한 픽 셀 의 위 와 왼쪽 인접 도 메 인 에 있 는 픽 셀 에 디지털 라벨 이 있 을 때 이들 의 최소 값 을 현재 픽 셀 의 태그 로 합 니 다.그렇지 않 으 면 현재 픽 셀 에 새로운 디지털 라벨 을 부여 합 니 다.그림 을 처음 옮 겨 다 닐 때 같은 연결 도 메 인 에 하나 이상 의 탭 이 부 여 될 수 있 습 니 다.
피 드 충전 법 은 컴퓨터 그래 픽 학 에서 유래 하여 일부 도형 을 채 우 는 데 자주 사용 된다.이 방법 은 우선 0 픽 셀 이 아 닌 모든 픽 셀 을 하나의 집합 에 넣 은 다음 집합 에서 무 작위 로 픽 셀 을 피 드 픽 셀 로 선택 하고 인접 도 메 인 관계 에 따라 피 드 픽 셀 이 있 는 연결 도 메 인 을 계속 확장 하 며 집합 에서 확 장 된 픽 셀 을 삭제 합 니 다.피 드 픽 셀 이 있 는 연결 도 메 인 이 확장 되 지 않 을 때 까지 집합 에서 무 작위 로 픽 셀 을 새로운 피 드 픽 셀 로 선택 합 니 다.집합 에 픽 셀 이 없 을 때 까지 상기 과정 을 반복 합 니 다.

CV_EXPORTS_AS(connectedComponentsWithAlgorithm) int connectedComponents(InputArray image, OutputArray labels,
                                           int connectivity, int ltype, int ccltype);
  • image:서로 다른 연결 도 메 인 을 표시 할 단일 채널 이미지,데이터 형식 은 CV 이 어야 합 니 다.8U。
  • 4.567917.labels:서로 다른 연결 도 메 인 후의 출력 이미 지 를 표시 하고 입력 이미지 와 같은 사 이 즈 를 가 집 니 다
  • connectivity:연결 도 메 인 을 표시 할 때 사용 하 는 이웃 도 메 인 종 류 를 표시 하고 4 는 4-이웃 도 메 인,8 은 8-이웃 도 메 인 을 표시 합 니 다
  • ltype:출력 이미지 의 데이터 형식,현재 CV 지원32S 와 CV16U 두 가지 데이터 형식..
  • ccltype:연결 도 메 인 을 표시 할 때 사용 하 는 알고리즘 유형 표 지 는 선택 할 수 있 는 매개 변수 와 의 미 를 표 에서 제시 합 니 다

  • 이 함 수 는 2 값 그림 의 연결 도 메 인 개 수 를 계산 하고 그림 에서 서로 다른 연결 도 메 인 을 서로 다른 디지털 태그 로 표시 합 니 다.그 중에서 태그 0 은 그림 의 배경 구역 을 표시 하 는 동시에 함수 가 int 형식의 반환 데 이 터 를 가지 고 이미지 의 연결 도 메 인 수 를 표시 합 니 다.함수 의 첫 번 째 매개 변 수 는 연결 도 메 인 을 표시 할 입력 이미지 입 니 다.함수 가 그림 을 입력 하려 면 데이터 형식 이 CV 여야 합 니 다.8U 의 단일 채널 그 레이스 케 일 이미지 이 며,이치 화 된 2 값 그림 이 좋 습 니 다.함수 두 번 째 매개 변 수 는 연결 도 메 인 을 표시 한 출력 이미지 입 니 다.이미지 사 이 즈 는 첫 번 째 매개 변수의 입력 이미지 크기 와 같 고 이미지 의 데이터 형식 은 함수 의 네 번 째 매개 변수 와 관련 이 있 습 니 다.함수 세 번 째 매개 변 수 는 연결 도 메 인 을 통계 할 때 선택 한 인접 도 메 인 종류 입 니 다.함 수 는 두 가지 인접 도 메 인 을 지원 합 니 다.각각 4 로 4-이웃 도 메 인 을 표시 하고 8 은 8-이웃 도 메 인 을 표시 합 니 다.함수 네 번 째 매개 변 수 는 출력 이미지 의 데이터 형식 이 고 선택 할 수 있 는 매개 변 수 는 CV 입 니 다.32S 와 CV16U 두 가지.함수 의 마지막 매개 변 수 는 연결 도 메 인 을 표시 할 때 알고리즘 을 사용 하 는 표지 입 니 다.선택 할 수 있 는 매개 변수 와 의 미 는 표 에서 제 시 됩 니 다.현 재 는 Grana(BBDT)와 Wu(SAUF)두 가지 알고리즘 만 지원 합 니 다. 
    OpenCV 는 간단 한 함수 형식 도 제시 했다.
    
    int connectedComponents(InputArray image, OutputArray labels,
                                         int connectivity = 8, int ltype = CV_32S);
  • image:서로 다른 연결 도 메 인 을 표시 할 이미지 단일 채널,데이터 형식 은 CV 이 어야 합 니 다.8U。
  • 4.567917.labels:서로 다른 연결 도 메 인 후의 출력 이미 지 를 표시 하고 입력 이미지 와 같은 사 이 즈 를 가 집 니 다
  • connectivity:연결 도 메 인 을 표시 할 때 사용 하 는 이웃 도 메 인 종 류 를 표시 합 니 다.4 는 4-이웃 도 메 인 을 표시 하고 8 은 8-이웃 도 메 인 을 표시 하 며 기본 매개 변 수 는 8 입 니 다
  • ltype:출력 이미지 의 데이터 형식,현재 CV 지원32S 와 CV16U 두 가지 데이터 형식,기본 매개 변 수 는 CV32S。
  • 이 함수 원형 은 네 개의 매개 변수 만 있 습 니 다.앞의 두 매개 변 수 는 각각 입력 이미지 와 출력 이미 지 를 표시 합 니 다.세 번 째 매개 변 수 는 연결 도 메 인 을 통계 할 때 선택 한 이웃 도 메 인 종 류 를 표시 합 니 다.각각 4 로 4-이웃 도 메 인 을 표시 하고 8 은 8-이웃 도 메 인 을 표시 하 며 매개 변수의 기본 값 은 8 입 니 다.마지막 매개 변 수 는 출력 이미지 의 데이터 형식 을 표시 합 니 다.선택 할 수 있 는 매개 변 수 는 CV 입 니 다.32S 와 CV16U 두 가지,인자 의 기본 값 은 CV 입 니 다.32S。이 함수 원형 은 두 개의 매개 변수 가 기본 값 을 가지 고 있 으 며 사용 할 때 최소 두 개의 매개 변수 만 필요 하여 함수 호출 에 매우 편리 합 니 다.
    각 연결 역 의 중심 위치,사각형 구역 크기,지역 면적 등 정 보 를 한층 더 통계 한다.
    복잡 하 다
    
    CV_EXPORTS_AS(connectedComponentsWithStatsWithAlgorithm) int connectedComponentsWithStats(InputArray image, OutputArray labels,
                                  OutputArray stats, OutputArray centroids,
                                  int connectivity, int ltype, int ccltype);
  • image:서로 다른 연결 도 메 인 을 표시 할 단일 채널 이미지,데이터 형식 은 CV 이 어야 합 니 다.8U。
  • 4.567917.labels:서로 다른 연결 도 메 인 후의 출력 이미 지 를 표시 하고 입력 이미지 와 같은 사 이 즈 를 가 집 니 다
  • stats:서로 다른 연결 도 메 인 통계 정 보 를 포함 한 행렬,행렬 의 데이터 유형 은 CV32S。행렬 에서 i 줄 은 i 로 표 시 된 연결 역 의 통계 적 특성 으로 저 장 된 통계 정보의 종 류 는 표 6-4 에서 제시한다
  • centroids:각 연결 역 의 질량 중심 좌표,데이터 유형 은 CV64F。
  • connectivity:연결 도 메 인 을 표시 할 때 사용 하 는 이웃 도 메 인 종 류 를 표시 하고 4 는 4-이웃 도 메 인,8 은 8-이웃 도 메 인 을 표시 합 니 다
  • ltype:출력 이미지 의 데이터 형식,현재 CV 지원32S 와 CV16U 두 가지 데이터 형식..
  • 4.567917.ccltype:연결 도 메 인 에서 사용 하 는 알고리즘 유형 표 지 를 표시 하고 선택 할 수 있 는 매개 변수 와 의 미 를 표 에서 제시 합 니 다.
    이 함 수 는 이미지 에 서로 다른 연결 도 메 인 태그 와 함께 모든 연결 도 메 인의 중심 위치,사각형 구역 크기,지역 면적 등 정 보 를 통계 할 수 있 습 니 다.함수 의 앞 두 매개 변수 의 미 는 connected Components()함수 의 앞 두 매개 변수 의 의미 와 일치 하 며 모두 입력 이미지 와 출력 이미지 입 니 다.함수 의 세 번 째 매개 변 수 는 모든 연결 도 메 인 통계 정보 행렬 입 니 다.그림 에 N 개의 연결 도 메 인 이 있 으 면 이 매개 변수 가 출력 하 는 행렬 사 이 즈 는 N 입 니 다.×5.행렬 의 각 줄 은 각 연결 역 의 통계 적 특성 을 저장 하고 상세 한 통계 적 특성 은 표 에서 제시 합 니 다.i 번 째 연결 역 을 포함 하 는 경계 상자 의 수평 길 이 를 읽 으 려 면 stats.at(i,CCSTAT_WIDTH)또는 stats.at(i,0)를 읽 습 니 다.함수 의 네 번 째 매개 변 수 는 각 연결 도 메 인 질량 의 좌표 입 니 다.그림 에 N 개의 연결 도 메 인 이 있 으 면 이 매개 변수 가 출력 하 는 행렬 사 이 즈 는 N 입 니 다.×2.행렬 의 모든 줄 은 각 연 결 된 도 메 인 질량 심 의 x 좌표 와 y 좌 표를 저장 하고 centroids.at(i,0)와 centroids.at(i,1)를 통 해 각각 i 번 째 연 결 된 도 메 인 질량 심 의 x 좌표 와 y 좌 표를 읽 을 수 있다.함수 다섯 번 째 매개 변 수 는 연결 도 메 인 을 통계 할 때 선택 한 이웃 도 메 인 종류 입 니 다.함 수 는 두 가지 이웃 도 메 인 을 지원 합 니 다.각각 4 로 4-이웃 도 메 인 을 표시 하고 8 은 8-이웃 도 메 인 을 표시 합 니 다.함수 여섯 번 째 매개 변 수 는 출력 이미지 의 데이터 형식 이 고 선택 할 수 있 는 매개 변 수 는 CV 입 니 다.32S 와 CV16U 두 가지.함수 의 마지막 매개 변 수 는 연결 도 메 인 을 표시 하 는 알고리즘 입 니 다.선택 할 수 있 는 매개 변 수 는 위 표 에서 보 여 줍 니 다.현 재 는 Grana(BBDT)와 Wu(SAUF)두 가지 알고리즘 만 지원 합 니 다. 

    간단했어
    
    int connectedComponentsWithStats(InputArray image, OutputArray labels,
                                                  OutputArray stats, OutputArray centroids,
                                                  int connectivity = 8, int ltype = CV_32S);
    
    
  • image:서로 다른 연결 도 메 인 을 표시 할 단일 채널 이미지,데이터 형식 은 CV 이 어야 합 니 다.8U。
  • 4.567917.labels:서로 다른 연결 도 메 인 후의 출력 이미 지 를 표시 하고 입력 이미지 와 같은 사 이 즈 를 가 집 니 다
  • stats:서로 다른 연결 역 의 통계 정보 행렬,행렬 의 데이터 유형 은 CV32S。행렬 에서 i 줄 은 i 로 표 시 된 연결 역 의 통계 적 특성 으로 저 장 된 통계 정보의 종 류 는 표 6-4 에서 제시한다
  • centroids:각 연결 역 의 질량 중심 좌표,데이터 유형 은 CV64F。
  • connectivity:연결 도 메 인 을 표시 할 때 사용 하 는 이웃 도 메 인 종 류 를 표시 합 니 다.4 는 4-이웃 도 메 인 을 표시 하고 8 은 8-이웃 도 메 인 을 표시 하 며 기본 매개 변 수 는 8 입 니 다
  • ltype:그림 을 출력 하 는 데이터 형식 으로 현재 CV 만 지원 합 니 다.32S 와 CV16U 이 두 가지 데이터 형식,기본 매개 변 수 는 CV 입 니 다.32S。
  • 이 함수 원형 은 여섯 개의 매개 변수 만 있 고 앞의 두 개의 매개 변 수 는 각각 입력 이미지 와 출력 이미 지 를 나타 내 며 세 번 째 매개 변 수 는 각 연결 역 의 통계 정 보 를 나타 내 고 네 번 째 매개 변 수 는 각 연결 역 의 질량 중심 위 치 를 나타 낸다.뒤의 두 매개 변 수 는 연결 도 메 인 을 통계 할 때 선택 한 이웃 도 메 인 종 류 를 나타 내 고 각각 4 로 4-이웃 도 메 인 을 나타 내 며 8 은 8-이웃 도 메 인 을 나타 내 고 매개 변수의 기본 값 은 8 이다.마지막 매개 변 수 는 출력 이미지 의 데이터 형식 을 표시 합 니 다.선택 할 수 있 는 매개 변 수 는 CV 입 니 다.32S 와 CV16U 두 가지,인자 의 기본 값 은 CV 입 니 다.32S。이 함수 원형 은 두 개의 매개 변수 가 기본 값 을 가지 고 있 으 며,사용 할 때 최소 네 개의 매개 변수 만 필요 하 며,함수 호출 에 매우 편리 합 니 다.
    단순 예시
    
    //
    // Created by smallflyfly on 2021/6/16.
    //
     
    #include "opencv2/opencv.hpp"
    #include "opencv2/highgui.hpp"
     
    #include <iostream>
     
    using namespace std;
    using namespace cv;
     
    int main() {
     
        Mat im = imread("rice.jfif");
        Mat gray;
        cvtColor(im, gray, CV_BGR2GRAY);
    //    resize(im, im, Size(0, 0), 0.5, 0.5);
     
        imshow("im", im);
     
        Mat im1;
        threshold(gray, im1, 125, 255, THRESH_BINARY);
     
        imshow("im1", im1);
    //    waitKey(0);
     
        RNG rng(10010);
        Mat out;
        int num = connectedComponents(im1, out, 8, CV_16U);
        vector<Vec3b> colors;
        for (int i=0; i<num; i++) {
            //              
            Vec3b vec = Vec3b(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256));
            colors.push_back(vec);
        }
        Mat result = Mat::zeros(im.size(), im.type());
        for (int i = 0; i < im.rows; ++i) {
            for (int j = 0; j < im.cols; ++j) {
                int label = out.at<uint16_t>(i, j);
                if (label == 0) {
                    continue;
                }
                result.at<Vec3b>(i, j) = colors[label];
            }
        }
     
        imshow("result", result);
     
        Mat labels, stats, centroids;
        int count = connectedComponentsWithStats(im1, labels, stats, centroids, 8);
        cout << count << endl;
     
        for (int i = 1; i < count; ++i) {
            int x = centroids.at<double>(i, 0);
            int y = centroids.at<double>(i, 1);
            cout << x << " " << y << endl;
            circle(im, Point(x, y), 2, Scalar(0, 0, 255), -1);
            int xmin = stats.at<int>(i, CC_STAT_LEFT);
            int ymin = stats.at<int>(i, CC_STAT_TOP);
            int w = stats.at<int>(i, CC_STAT_WIDTH);
            int h = stats.at<int>(i, CC_STAT_HEIGHT);
     
            Rect rect(xmin, ymin, w, h);
            rectangle(im, rect, Scalar(0, 255, 255), 2);
            putText(im, to_string(i), Point(x+5, y), FONT_HERSHEY_SCRIPT_SIMPLEX, 1, Scalar(0, 0, 255), 2);
        }
     
        imshow("im", im);
     
        waitKey(0);
        destroyAllWindows();
     
        return 0;
     
    }
    단순 이색 도 효과 가 비교적 뚜렷 하 다  바 이 두 

    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기