OpenCV 이미지 팽창 실현

이미지 의 팽창 과 이미지 부식 은 상 반 된 과정 으로 이미지 부식 과 비슷 하 며 이미지 팽창 역시 구조 요소 가 이미지 팽창 을 제어 하 는 효과 가 필요 하 다.구조 요 소 는 구조의 중심 점 을 임의로 지정 할 수 있 고 구조 요소 의 크기 와 구체 적 인 내용 은 모두 수요 에 따라 스스로 정의 할 수 있다.구조 요 소 를 정의 한 후 구조 요소 의 중심 점 을 그림 의 모든 비 0 요소 에 순서대로 놓 습 니 다.만약 에 원래 이미지 의 특정한 요소 가 구조 요소 에 의 해 덮어 지지 만 이 픽 셀 의 픽 셀 값 은 구조 요소 중심 점 에 대응 하 는 픽 셀 값 과 같 지 않 으 면 원래 이미지 의 이 픽 셀 의 픽 셀 값 을 구조 요소 중심 점 대응 점 의 픽 셀 값 으로 수정 합 니 다.그림 의 팽창 과정 설명도 그림 에서 보 듯 이 그림 왼쪽 은 팽창 을 기다 리 는 원래 이미지 이 고 중간 은 구조 요소 이다.먼저 구조 요소 의 중심 을 원래 이미지 의 A 픽 셀 과 겹 치고 구조 요소 가 덮 인 모든 픽 셀 의 픽 셀 값 을 1 로 수정 하여 구조 요소 의 중심 점 을 원래 이미지 의 모든 픽 셀 과 차례로 겹 쳐 채 워 야 할 픽 셀 이 있 는 지 판단 한다.원본 이미지 가 팽창 한 결 과 는 그림 의 오른쪽 이미지 와 같다.

이미지 팽창 수학 은 형식 예 를 들 어 식(6.5)에서 보 듯 이 공식 을 통 해 알 수 있 듯 이 이미지 A 의 팽창 연산 은 구조 요소 B 를 모두 포함 할 수 있 는 이미 지 를 생 성 하 는 것 이다.

팽창 함수

void dilate( 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 중 하나..
  • 4.567917.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 번 만 팽창 하 는 것 을 나타 냅 니 다.함수 여섯 번 째 매개 변 수 는 이미지 픽 셀 외 추 법의 선택 표지 입 니 다.일곱 번 째 매개 변 수 는 경계 가 변 하지 않 는 외 추 법 을 사용 할 때의 경계 값 입 니 다.이 두 매개 변 수 는 이미지 의 주요 부분의 팽창 작업 에 영향 을 주지 않 기 때문에 대부분 상황 에서 기본 값 을 사용 하면 됩 니 다.
    단순 예시
    
    //
    // Created by smallflyfly on 2021/6/18.
    //
     
    #include "opencv2/opencv.hpp"
     
    #include <iostream>
     
    using namespace cv;
    using namespace std;
     
    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 dilateM1, dilateM2;
        dilate(src, dilateM1, m1, Point(-1, -1), 5);
        dilate(src, dilateM2, m2, Point(-1, -1), 5);
     
        imshow("src", src);
        imshow("dilateM1", dilateM1);
        imshow("dilateM2", dilateM2);
     
        Mat xbim = imread("xiaobai.jpg");
        Mat xbM1, xbM2;
        dilate(xbim, xbM1, m1, Point(-1, -1), 2);
        dilate(xbim, xbM2, m2, Point(-1, -1), 2);
     
        imshow("xbim", xbim);
        imshow("xbM1", xbM1);
        imshow("xbM2", xbM2);
     
        Mat im = imread("rice.jfif");
        resize(im, im, Size(0, 0), 0.6, 0.6);
        Mat im1 = 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(im, count1, stats, centroids, "no dilate");
     
        Mat dilateIm1, dilateIm2;
        dilate(riceBin, dilateIm1, m1, Point(-1, -1), 5);
        dilate(riceBin, dilateIm2, m2, Point(-1, -1), 5);
     
        int count2 = connectedComponentsWithStats(dilateIm1, out, stats, centroids, 8, CV_16U);
        drawResult(dilateIm1, count2, stats, centroids, "dilateIm1");
        int count3 = connectedComponentsWithStats(dilateIm2, out, stats, centroids, 8, CV_16U);
        drawResult(dilateIm2, count3, stats, centroids, "dilateIm2");
     
        waitKey(0);
        destroyAllWindows();
     
    }

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

    좋은 웹페이지 즐겨찾기