OpenCV 이미지 부식 실현
이미지 부식 사용 가능"Θ”이 는 수학 적 표현 형식 인 예 를 들 어 식(6.4)에서 보 듯 이 공식 을 통 해 알 수 있 듯 이 이미지 A 에 대한 부식 연산 은 이미지 에 구조 요소 B 를 모두 포함 할 수 있 는 픽 셀 점 을 찾 는 것 이다.
자주 사용 하 는 사각형 구조 요소,십자 구조 요소 와 타원 구 조 를 생 성 합 니 다.
Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
4.567917.shape:구조 요소 의 종류,선택 할 수 있 는 매개 변수 와 의 미 는 표 6-5 에서 제시 합 니 다ksize:구조 요소 의 크기4.567917.anchor:중심 점 의 위치,기본 매개 변 수 는 구조 요소 의 기하학 적 중심 점 입 니 다.이 함 수 는 이미지 형태학 작업 에서 자주 사용 하 는 사각형 구조 요소,십자 구조 요소 와 타원 구조 요 소 를 생 성 하 는 데 사용 된다.함수 의 첫 번 째 매개 변 수 는 구조 요 소 를 생 성 하 는 종류 로 선택 할 수 있 는 매개 변수 와 의 미 는 표 에서 제시 합 니 다.함수 의 두 번 째 매개 변 수 는 구조 요소 의 크기 로 이미지 부식 효과 에 영향 을 줄 수 있 습 니 다.일반적인 상황 에서 구조 요소 의 종류 가 같 을 수록 구조 요소 의 크기 가 크 고 부식 효과 가 뚜렷 합 니 다.함수 의 마지막 매개 변 수 는 구조 요소 의 중심 점 으로 십자 구조 요소 의 중심 점 위치 만 이미지 부식 후의 윤곽 모양 에 영향 을 주 고 다른 종류의 구조 요소 의 중심 점 위 치 는 형태학 작업 결과 의 평 이 량 에 만 영향 을 줄 수 있다.
부식 함수
void erode( InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
함수 의 첫 번 째 매개 변 수 는 부식 되 지 않 은 이미지 입 니 다.이미지 채널 수 는 임 의 일 수 있 지만 이미지 의 데이터 형식 은 CV 여야 합 니 다.8U,CV_16U,CV_16S,CV_32F 또는 CV64F 중 하나.
함수 두 번 째 매개 변 수 는 부 식 된 출력 이미지 로 입력 이미지 와 같은 사이즈 와 데이터 형식 을 가지 고 있 습 니 다.
함수 세 번 째 와 네 번 째 매개 변 수 는 모두 구조 요소 와 관련 된 매개 변수 이 고 세 번 째 매개 변 수 는 구조 요소 이 며 네 번 째 매개 변 수 는 구조 요소 의 중심 위치 이 며 네 번 째 매개 변수의 기본 값 은 Point(-1,-1)로 구조 요소 의 기하학 적 중심 이 구조 요소 의 중심 점 임 을 나타 낸다.
함수 다섯 번 째 매개 변 수 는 구조 요 소 를 사용 하여 부식 하 는 횟수 로 부식 횟수 가 많 을 수록 효과 가 뚜렷 하 며 매개 변 수 는 기본 값 이 1 로 1 번 만 부식 되 는 것 을 나타 낸다.
함수 여섯 번 째 매개 변 수 는 이미지 픽 셀 외 추 법의 선택 표지 입 니 다.
일곱 번 째 매개 변 수 는 경계 가 변 하지 않 는 외부 추론 을 사용 할 때의 경계 값 입 니 다.이 두 매개 변 수 는 이미지 의 주요 부분의 부식 작업 에 영향 을 주지 않 기 때문에 대부분 상황 에서 기본 값 을 사용 하면 됩 니 다.
주의해 야 할 것 은 이 함수 의 부식 과정 은 이미지 의 0 픽 셀 이 아 닌 것 만 을 대상 으로 하기 때문에 그림 이 0 픽 셀 을 배경 으로 한다 면 부식 작업 후 이미지 의 내용 이 더욱 말 라 지고 작 아 지 는 것 을 볼 수 있 습 니 다.그림 이 255 픽 셀 을 배경 으로 한다 면 부식 작업 후 그림 의 내용 이 더욱 굵 어 지고 커 지 는 것 을 볼 수 있 습 니 다.
단순 예시
//
// Created by smallflyfly on 2021/6/18.
//
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;
void drawResult(Mat im, int num, Mat stats, Mat centroids, const string& name) {
for (int i = 1; i < num; ++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(255, 255, 255), 2);
putText(im, to_string(i), Point(x+5, y), FONT_HERSHEY_SCRIPT_SIMPLEX, 0.3, Scalar(0, 0, 255), 1);
}
imshow(name, im);
}
int main() {
Mat src = (
Mat_<uchar>(6, 6) <<
0, 0, 0, 0, 255, 0,
0, 255, 255, 255, 255, 255,
0, 255, 255, 255, 255, 0,
0, 255, 255, 255, 255, 0,
0, 255, 255, 255, 255, 0,
0, 0, 0, 0, 255, 0
);
resize(src, src, Size(0, 0), 50, 50, INTER_NEAREST);
Mat m1, m2;
m1 = getStructuringElement(0, Size(3, 3));
m2 = getStructuringElement(1, Size(3, 3));
Mat erodeM1, erodeM2;
erode(src, erodeM1, m1, Point(-1, -1), 10);
erode(src, erodeM2, m2, Point(-1, -1), 10);
imshow("src", src);
imshow("erodeM1", erodeM1);
imshow("erodeM2", erodeM2);
Mat xbim = imread("xiaobai.jpg");
Mat xbM1, xbM2;
erode(xbim, xbM1, m1, Point(-1, -1), 2);
erode(xbim, xbM2, m2, Point(-1, -1), 2);
imshow("xb", xbim);
imshow("xbM1", xbM1);
imshow("xbM2", xbM2);
Mat im = imread("rice.jfif");
Mat im1 = im.clone();
Mat im2 = im.clone();
Mat im3 = im.clone();
Mat gray;
cvtColor(im, gray, CV_BGR2GRAY);
Mat riceBin;
threshold(gray, riceBin, 125, 255, THRESH_BINARY);
Mat out, stats, centroids;
int count1 = connectedComponentsWithStats(riceBin, out, stats, centroids, 8, CV_16U);
drawResult(im1, count1, stats, centroids, "no erode");
Mat erodeIm1, erodeIm2;
erode(riceBin, erodeIm1, m1, Point(-1, -1), 5);
erode(riceBin, erodeIm2, m2, Point(-1, -1), 5);
int count2 = connectedComponentsWithStats(erodeIm1, out, stats, centroids, 8, CV_16U);
drawResult(erodeIm1, count2, stats, centroids, "erode1");
int count3 = connectedComponentsWithStats(erodeIm2, out, stats, centroids, 8, CV_16U);
drawResult(erodeIm2, count3, stats, centroids, "erode2");
waitKey(0);
destroyAllWindows();
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.