OpenCV 이미지 연결 영역 구현
일반적인 상황 에서 하나의 연결 도 메 인 에는 하나의 픽 셀 값 만 포함 되 어 있 기 때문에 픽 셀 값 변동 이 서로 다른 연결 도 메 인 추출 에 미 치 는 영향 을 방지 하기 위해 연결 도 메 인 분석 은 항상 이치 화 된 이미지 입 니 다.
4-인접 지역 과 8-인접 지역:
자주 사용 하 는 이미지 인접 도 메 인 분석 법 은 두 번 의 스 캔 법 과 피 드 충전 법 이 있다.두 번 의 스 캔 법 은 두 번 의 그림 을 옮 겨 다 닙 니 다.첫 번 째 그림 을 옮 겨 다 닐 때 0 픽 셀 이 아 닌 모든 숫자 라벨 을 부여 합 니 다.특정한 픽 셀 의 위 와 왼쪽 인접 도 메 인 에 있 는 픽 셀 에 디지털 라벨 이 있 을 때 이들 의 최소 값 을 현재 픽 셀 의 태그 로 합 니 다.그렇지 않 으 면 현재 픽 셀 에 새로운 디지털 라벨 을 부여 합 니 다.그림 을 처음 옮 겨 다 닐 때 같은 연결 도 메 인 에 하나 이상 의 탭 이 부 여 될 수 있 습 니 다.
피 드 충전 법 은 컴퓨터 그래 픽 학 에서 유래 하여 일부 도형 을 채 우 는 데 자주 사용 된다.이 방법 은 우선 0 픽 셀 이 아 닌 모든 픽 셀 을 하나의 집합 에 넣 은 다음 집합 에서 무 작위 로 픽 셀 을 피 드 픽 셀 로 선택 하고 인접 도 메 인 관계 에 따라 피 드 픽 셀 이 있 는 연결 도 메 인 을 계속 확장 하 며 집합 에서 확 장 된 픽 셀 을 삭제 합 니 다.피 드 픽 셀 이 있 는 연결 도 메 인 이 확장 되 지 않 을 때 까지 집합 에서 무 작위 로 픽 셀 을 새로운 피 드 픽 셀 로 선택 합 니 다.집합 에 픽 셀 이 없 을 때 까지 상기 과정 을 반복 합 니 다.
CV_EXPORTS_AS(connectedComponentsWithAlgorithm) int connectedComponents(InputArray image, OutputArray labels,
int connectivity, int ltype, int 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);
각 연결 역 의 중심 위치,사각형 구역 크기,지역 면적 등 정 보 를 한층 더 통계 한다.
복잡 하 다
CV_EXPORTS_AS(connectedComponentsWithStatsWithAlgorithm) int connectedComponentsWithStats(InputArray image, OutputArray labels,
OutputArray stats, OutputArray centroids,
int connectivity, int ltype, int 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);
단순 예시
//
// 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;
}
단순 이색 도 효과 가 비교적 뚜렷 하 다 바 이 두 이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.