OpenCV 이미지 부식 실현

이미지 의 부식 과정 은 이미지 의 볼 륨 작업 과 유사 하 며,모두 템 플 릿 행렬 로 연산 결 과 를 제어 해 야 하 며,이미지 의 부식 과 팽창 에서 이 템 플 릿 행렬 은 구조 요소 라 고 불 린 다.이미지 볼 륨 과 마찬가지 로 구조 요 소 는 이미지 의 중심 점 을 임의로 지정 할 수 있 고 구조 요소 의 크기 와 구체 적 인 내용 은 수요 에 따라 스스로 정의 할 수 있다.구조 요 소 를 정의 한 후 구조 요소 의 중심 점 을 그림 에 있 는 모든 비 0 요소 에 순서대로 놓 습 니 다.이때 구조 요소 에 있 는 모든 요소 가 덮어 쓰 는 이미지 픽 셀 값 이 0 이 아니라면 구조 요소 중심 점 에 대응 하 는 이미지 픽 셀 을 유지 합 니 다.그렇지 않 으 면 구조 요소 중심 점 에 대응 하 는 픽 셀 을 삭제 합 니 다.그림 의 부식 과정 설명도 그림 6-12 에서 보 듯 이 그림 6-12 에서 왼쪽 은 부식 되 기 를 기다 리 는 원래 이미지 이 고 중간 은 구조 요소 이다.먼저 구조 요소 의 중심 을 원래 이미지 의 A 픽 셀 과 겹 친다.이때 구조 요소 중심 점 의 왼쪽 과 위 요소 가 덮 인 이미지 픽 셀 값 은 모두 0 이 므 로 원래 이미지 의 A 픽 셀 을 삭제 해 야 한다.구조 요소 의 중심 점 을 B 픽 셀 과 겹 칠 때 구조 요소 의 모든 요소 가 덮어 쓰 는 이미지 픽 셀 값 은 1 이 므 로 원래 이미지 의 B 픽 셀 을 유지 합 니 다.구조 요소 의 중심 점 을 순서대로 원래 이미지 의 모든 픽 셀 과 겹 쳐 모든 픽 셀 점 이 보존 되 거나 삭제 되 었 는 지 판단 하고 최종 적 으로 원래 이미지 가 부식 되 었 는 지 여 부 는 그림 의 오른쪽 이미지 와 같다.

이미지 부식 사용 가능"Θ”이 는 수학 적 표현 형식 인 예 를 들 어 식(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() );
  • src:입력 한 부식 대기 이미지,이미지 의 채널 수 는 임 의 일 수 있 지만 이미지 의 데이터 형식 은 CV 여야 합 니 다.8U,CV_16U,CV_16S,CV_32F 또는 CV64F 중 하나..
  • dst:부 식 된 출력 이미지 로 입력 이미지 src 와 같은 사이즈 와 데이터 형식 을 가지 고 있 습 니 다
  • kernel:부식 작업 에 사용 되 는 구조 요 소 는 스스로 정의 할 수 있 고 getStructuringElement()함수 로 생 성 할 수 있 습 니 다
  • 4.567917.anchor:중심 점 이 구조 요소 에 있 는 위치 이 고 기본 적 인 매개 변 수 는 구조 요소 의 기하학 적 중심 점 이다
  • iterations:부식 횟수,기본 값 은 1 입 니 다
  • 4.567917.border Type:픽 셀 외 추 법 은 표 지 를 선택 하고 수치 범 위 는 표 3-5 에서 제시 합 니 다.기본 매개 변 수 는 BORDERDEFAULT 는 경계 값 의 역순 충전 을 포함 하지 않 음 을 표시 합 니 다
  • borderValue:경계 변 하지 않 는 외부 추론 을 사용 할 때의 경계 값.
  • 이 함 수 는 구조 요소 에 따라 입력 이미 지 를 부식 시 키 고 다 중 채널 이미 지 를 부식 시 킬 때 모든 채널 이 독립 적 으로 부식 연산 을 한다.
    함수 의 첫 번 째 매개 변 수 는 부식 되 지 않 은 이미지 입 니 다.이미지 채널 수 는 임 의 일 수 있 지만 이미지 의 데이터 형식 은 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();
     
    }

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

    좋은 웹페이지 즐겨찾기