OpenCV 분리 가능 필터 구현

4409 단어 OpenCV분리 필터
사용자 정의 필터
이미지 볼 륨 이 든 필터 든 원 이미지 에서 필 터 를 이동 하 는 과정 에서 매번 의 계산 결 과 는 뒤의 과정의 계산 결과 에 영향 을 주지 않 기 때문에 이미지 필 터 는 병렬 알고리즘 으로 병렬 계산 을 제공 할 수 있 는 프로세서 에서 이미지 필터 의 처리 속 도 를 크게 가속 화 할 수 있다.
이미지 필 터 는 분리 성 을 가지 고 있다.
먼저 X(Y)방향 을 필터 한 다음 Y(X)방향 을 필터 한 결 과 는 두 방향의 필 터 를 결합 한 후 전체 필터 의 결과 와 같다.두 방향의 필터 의 결합 은 두 방향의 필 터 를 곱 하여 직사각형 필 터 를 얻 는 것 이다.

void filter2D( InputArray src, OutputArray dst, int ddepth,
                            InputArray kernel, Point anchor = Point(-1,-1),
                            double delta = 0, int borderType = BORDER_DEFAULT );
src:필터 이미지
  • dst:출력 이미지,입력 이미지 src 와 같은 사이즈,채널 수 와 데이터 형식 을 가지 고 있 습 니 다
  • ddepth:출력 이미지 의 데이터 형식(깊이)은 입력 이미지 의 데이터 형식 에 따라 서로 다른 수치 범 위 를 가지 고 구체 적 인 수치 범 위 는 표 5-1 에서 제시 합 니 다.할당 값 이-1 일 때 출력 이미지 의 데이터 형식 은 자동 으로 선택 합 니 다
  • 커 널:필터4.567917.anchor:커 널 의 기준점(닻 점),기본 값 은(-1,-1)커 널 기준점 이 kernel 의 중심 위치 에 있 음 을 나타 낸다.기준점 은 볼 륨 핵 에서 처 리 된 픽 셀 점 과 겹 치 는 점 으로 그 위 치 는 볼 륨 핵 내부 에 있어 야 합 니 다4.567917.dela:편향 값,계산 결과 에 편향 값 을 더 합 니 다4.567917.border Type:픽 셀 외 추 법 은 표 지 를 선택 하고 수치 범 위 는 표 3-5 에서 제시 합 니 다.기본 매개 변 수 는 BORDERDEFAULT 는 경계 값 의 역순 충전 을 포함 하지 않 음 을 표시 합 니 다.
    
    void sepFilter2D( InputArray src, OutputArray dst, int ddepth,
                                   InputArray kernelX, InputArray kernelY,
                                   Point anchor = Point(-1,-1),
                                   double delta = 0, int borderType = BORDER_DEFAULT );
    src:필터 이미지
  • dst:출력 이미지,입력 이미지 src 와 같은 사이즈,채널 수 와 데이터 형식 을 가지 고 있 습 니 다
  • ddepth:출력 이미지 의 데이터 형식(깊이)은 입력 이미지 의 데이터 형식 에 따라 서로 다른 수치 범 위 를 가지 고 구체 적 인 수치 범 위 는 표 5-1 에서 제시 합 니 다.할당 값 이-1 일 때 출력 이미지 의 데이터 형식 은 자동 으로 선택 합 니 다
  • kernelX:X 방향의 필터,
  • kernely:Y 방향의 필터..
  • 4.567917.anchor:커 널 의 기준점(닻 점),기본 값 은(-1,-1)커 널 기준점 이 kernel 의 중심 위치 에 있 음 을 나타 낸다.기준점 은 볼 륨 핵 에서 처 리 된 픽 셀 점 과 겹 치 는 점 으로 그 위 치 는 볼 륨 핵 내부 에 있어 야 합 니 다4.567917.dela:편향 값,계산 결과 에 편향 값 을 더 합 니 다4.567917.border Type:픽 셀 외 추 법 은 표 지 를 선택 하고 수치 범 위 는 표 3-5 에서 제시 합 니 다.기본 매개 변 수 는 BORDERDEFAULT 는 경계 값 의 역순 충전 을 포함 하지 않 음 을 표시 합 니 다단순 예시
    
    //
    // Created by smallflyfly on 2021/6/15.
    //
     
    #include "opencv2/highgui.hpp"
    #include "opencv2/opencv.hpp"
     
    #include <iostream>
     
    using namespace std;
    using namespace cv;
     
    int main() {
        float points[] = {
                1, 2, 3, 4, 5,
                6, 7, 8, 9, 10,
                11, 12, 13, 14, 15,
                16, 17, 18, 19, 20,
                21, 22, 23, 24, 25
        };
        Mat data(5, 5, CV_32FC1, points);
     
        //           
        Mat gaussX = getGaussianKernel(3, 1);
        cout << gaussX << endl;
        Mat gaussDstData, gaussDataXY;
        GaussianBlur(data, gaussDstData, Size(3, 3), 1, 1, BORDER_CONSTANT);
        sepFilter2D(data, gaussDataXY, -1, gaussX, gaussX, Point(-1, -1), 0, BORDER_CONSTANT);
        cout << gaussDstData << endl;
        cout << gaussDataXY << endl;
        cout << "######################################" << endl;
     
        // Y     
        Mat a = (Mat_<float>(3, 1) << -1, 3, -1);
        // X     
        Mat b = a.reshape(1, 1);
        // XY    
        Mat ab = a * b;
        Mat dataX, dataY, dataXY1, dataXY2, dataSepXY;
        filter2D(data, dataX, -1, b);
        filter2D(dataX, dataXY1, -1, a);
        filter2D(data, dataXY2, -1, ab);
        sepFilter2D(data, dataSepXY, -1, a, b);
     
        //     
        cout << dataXY1 << endl;
        cout << dataXY2 << endl;
        cout << dataSepXY << endl;
     
        Mat im = imread("test.jpg");
        resize(im, im, Size(0, 0), 0.5, 0.5);
     
        Mat imX, imY, imXY, imSepXY;
        filter2D(im, imX, -1, b);
        filter2D(imX, imXY, -1, a);
        sepFilter2D(im, imSepXY, -1, a, b);
     
        imshow("imXY", imXY);
        imshow("imSepXY", imSepXY);
     
        waitKey(0);
        destroyAllWindows();
     
        return 0;
     
    }
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기