Programming/Qt

[도서 실습] Qt 5 and OpenCV 4 Computer Vision – ImageEditor (Plugin Mechanism – Sharpen)

변화의 물결1 2024. 2. 29. 00:04

 

 

안녕하세요.

 

  plugin을 만들고 설정하는데 어려움이 있었는데, 이제 기본 틀은 잡아 놓았으니, 이제 OpenCV의 기능을 간단하게 Plugin으로 만들 수 있습니다. 그리고 MainWindow에 dll 파일만 복사해 두면 기능이 나타나게 됩니다.

 

 이번에는 Sharpen 기능입니다. 영상을 선명하게 하거나 에지를 검출하는 데 사용합니다. 

 


 

1. Sharpen Filter

 

  - 명도가 변화하는 부분을 강조하여 이미지를 보다 선명하게 보정해 주는 필터입니다.

  - Sharpen 방법에는 2가지가 있습니다. 2차 미분을 사용하는 방법과 이미지 차이를 이용한 unsharp masking 방법입니다. 책 내용에서는 unsharp masking 방법을 이용해서 설명해주고 있습니다.

 

1) 미분을 이용하는 방법

 

  - 수식 설명이 되어 있는 글이 있어 링크로 대체하도록 하겠습니다.

  https://everyday-image-processing.tistory.com/140

 

 2) unsharp masking 이용하는 방법

 

  - original image에서 blurred image(averaged image)를 빼면 shrap 한 부분만 검출할 수 있습니다.

original image에 검출한 blurred Image를 sharp 한 부분을 더하면 기존의 이미지보다 더 선명한 이미지를 얻을 수 있습니다.

 

  unsharp masking의 일반적인 공식은 다음과 같습니다. amount는 가중치라고 생각하시면 됩니다.

sharpened = original + (original − blurred) × amount.

 

 - 에지를 검출하기 위해서는 라플라시안(Laplacian) 마스크를 사용합니다. 마스크의 항목의 합이 0이 되는 것입니다. 영상에 적용시키면 픽셀 값이 일정한 영역에서는 0이 되고 크게 변하는 에지가 있는 영역에서는 값이 값이 커지게 됩니다.

 

 

 

 - 영상을 선명하게 만들기 위해서도 라플라시안 마스크를 사용합니다. 그런데 차이점은 픽셀 값이 일정한 영역이 보존되어야 하기 때문에 마스크 배열의 항목들의 합이 1이 되도록 합니다.

 

 

 

2. 프로젝트 만들기

 

  - 프로젝트를 처음부터 만들면 귀찮을 수 있어서 Erode 폴더를 복사해서 사용하려고 했는데 이름 바꿔주어야 할 것이 많아서 그냥 라이브러리 프로젝트를 새로 만드는 것을 추천드립니다.

 

 

 

 - 생성되면 .pro 파일을 열어서 하단에 본인의 OpenCV 라이브러리 경로를 추가해 줍니다. 

 

win32 {
    INCLUDEPATH += D:/opencv/release/install/include
    LIBS += -Ld:/opencv/release/install/x64/mingw/bin \
     -lopencv_core453 \
     -lopencv_imgproc453
}

 

 

 

  - 생성된 sharpen_plugin_global.h 파일을 삭제하고 Erode에서 사용했던 EditorPluginInterface.h 파일을 생성된 sharpen_plugin 폴더로 복사해 줍니다. 그리고 Headers 목록에서 Add Existing Files... 눌러서 EditorPluginInterface.h 파일을 추가해 줍니다.

 

 

 

 3. h 파일 수정

 

  - Erode와 동일하게 헤더 파일을 추가하고 name()과 edit() 함수 등을 추가합니다.

 

#ifndef SHARPEN_PLUGIN_H
#define SHARPEN_PLUGIN_H

#include <QObject>
#include <QtPlugin>

#include "editor_plugin_interface.h"

class SharpenPlugin : public QObject, public EditorPluginInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID EDIT_PLUGIN_INTERFACE_IID);
    Q_INTERFACES(EditorPluginInterface);

    public:
        QString name();
        void edit(const cv::Mat &input, cv::Mat &output);
};

#endif // SHARPEN_PLUGIN_H

 

 

4. cpp 파일 수정

 

 - 메뉴로 나타날 이름을 정의합니다. 그리고 이 값은 메뉴를 어떤 메뉴를 알려주는 키값이 됩니다.  

 

 

QString SharpenPlugin::name()
{
    return "Sharpen";
}

void SharpenPlugin::edit(const cv::Mat &input, cv::Mat &output)
{
    int intensity = 2;
    cv::Mat smoothed;

    GaussianBlur(input, smoothed, cv::Size(9, 9), 0);
    output = input + (input - smoothed) * intensity;
}

 

 

 - intensity 변수는 이미지를 얼마나 선명하게 하는지를 나타내는 정수이고, smoothed는 blurred(흐리게, 부드러운 버전)된 이미지를 저장하기 위한 cv::Mat타입 변수로 선언합니다. 그런 다음 GaussianBlur 함수를 호출하여 흐리고 매끄러운 버전의 이미지를 만들어 smoothed 변수에 저장합니다.

 

 - 이미지 처리에서 Gaussian Blur는 특히 이미지의 노이즈나 세밀한 부분 줄이려는 경우 널리 채택되는 알고리즘입니다. 이것은 가우스 함수를 사용하여 이미지를 흐리게 하기 때문에 Carl Friedrich Gauss의 이름을 따서 지어졌습니다. 그리고 Gaussian smoothing라고도 합니다.

 

 - 이 알고리즘에 대한 자세한 내용은 http://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm에서 확인할 수 있습니다. 

 

 - GaussianBlur의 첫 번째와 두 번째 인자는 입력 및 출력 이미지입니다. 세 번째 인자는 커널의 크기를 나타내는 cv::Size 객체입니다. 네 번째 변수는 X 방향의 가우스 커널 표준편차를 나타내는 double형 변수입니다. 추가로 기본값이 있는 두 개의 추가 인자가 있습니다. 그것에 대한 좀 더 상세한 함수의 내용은 https://docs.opencv.org/4.0.0/d4/d86/group__imgproc__filter.html에서 찾아볼 수 있습니다.

 

 - 최종 결과를 Output 행렬 인자로 전달해서 호출한 곳으로 전달합니다.

 

 

5. 최종결과

 

  - 컴파일 후 이상이 없다면 Debug 폴더에 sharpen_plugin.dll 파일이 만들어졌을 겁니다. 이 파일을 Mainwindow 컴파일된 debug폴더의 plugins 폴더 안에 복사합니다. 이전 내용을 따라 했다면 erode_plugin.dll 파일도 있을 겁니다.

 

 - Sharpen 메뉴가 생성된 것을 확인할 수 있습니다. 원본 이미지를 하나 불러옵니다.

 

 

 

 

 - sharpen 필터를 한번 눌러봅니다. 머리카락을 비롯해서 에지(외곽선 주번이 좀 더 선명해진 것을 알 수 있습니다.

 

 

 

- 여러 번 sharpen 누를 경우 보이지 않던 노이즈까지도 나타나기 때문에 적절하게 사용해야 합니다.

 

 

 

  

감사합니다. 

 

 

<참고자료>

1. [BOOK] Qt-5-and-OpenCV-4-Computer-Vision-Projects

2. [openCV] 10 Spatial Filtering

https://m.blog.naver.com/o_o1341/221687847068

3. Unsharp masking

https://en.wikipedia.org/wiki/Unsharp_masking

4. 디지털 영상 처리 - 샤프닝 공간 필터(Sharpening Spatial Filter) : 라플라시안 필터

https://everyday-image-processing.tistory.com/140

5. 영상처리 강좌 3 - 컨볼루션(Convolution)과 스무딩(Smoothing), 샤프닝(Sharpening)

https://webnautes.tistory.com/1044  

반응형