形態學濾波

先來一波基本的解釋ide

這是基於opencv3的操做函數

仔細看啦字體

 

 

int main()  //***************形態學濾波*******************???????
{
    Mat picture;  //Original picture from cammmera
    Mat img;     //The  picture which has been done
    VideoCapture capture(0);
    while (1)
    {
        capture >> picture;
        Mat element = getStructuringElement(MORPH_RECT/*內核狀態*/, Size(9, 11)/*內核尺寸*/);//自定義內核 爲下面的操做作準備
                                         /*  MORPH_RECT 矩形
                                            MORPH_CROSS 交叉型
                                            MORPH_ELLIPSE 橢圓型
                                          */
               // 下面使用上面定義的內核,改變程度應該改變上面的內核
//       dilate(picture, img, element); //膨脹濾波
//        erode(picture, img, element);  //腐蝕濾波


/*              開運算 先腐蝕 後膨脹  
                閉運算 先膨脹 後腐蝕
                形態學梯度  膨脹圖與腐蝕圖的差
                頂帽    原圖像與開運算的差
                黑帽   閉運算的結果圖與原圖像的差
*/
        morphologyEx(picture, img, MORPH_DILATE, element/*getStructuringElement(MORPH_DILATE, Size(25, 25))直接使用element也能夠*/);//膨脹
                          /*
                            MORPH_DILATE 膨脹
                            MORPH_ERODE 腐蝕
                            MORPH_OPEN 開運算
                            MORPH_CLOSE 閉運算
                            MORPH_GRADIENT 形態學梯度
                            MORPH_TOPHAT 頂帽 
                             MORPH_BLACKHAT  黑帽
                          */

        imshow("Original Picture", picture);
                imshow("Dealed picture", img);
                waitKey(10);

            }
            return 0;
        }

下面呢是具體的操做ui

記得把圖片改爲本身的spa

 

解釋真的很很難寫code

//**********綜合演示*****************
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
Mat g_srcImage, g_dstImage;//原始圖和效果圖
int g_nElementShape = MORPH_RECT;//元素結構的形狀
//變量接收的TrackBar位置參數
int g_nMaxIterationNum = 10;
int g_nOpenCloseNum = 0;
int g_nErodeDilateNum = 0;
int g_nTopBlackHatNum = 0;
static void on_OpenClose(int, void*);//回調函數
static void on_ErodeDilate(int, void*);//回調函數
static void on_TopBlackHat(int, void*);//回調函數
static void ShowHelpText();
int main()
{
    //改變console字體顏色
    system("color 2F");

    ShowHelpText();

    //載入原圖
    g_srcImage = imread("1.jpg");
    if (!g_srcImage.data) { printf("Oh,no,讀取srcImage錯誤~! \n"); return false; }

    //顯示原始圖
    namedWindow("【原始圖】");
    imshow("【原始圖】", g_srcImage);

    //建立三個窗口
    namedWindow("【開運算/閉運算】", 1);
    namedWindow("【腐蝕/膨脹】", 1);
    namedWindow("【頂帽/黑帽】", 1);

    //參數賦值
    g_nOpenCloseNum = 9;
    g_nErodeDilateNum = 9;
    g_nTopBlackHatNum = 2;

    //分別爲三個窗口建立滾動條
    createTrackbar("迭代值", "【開運算/閉運算】", &g_nOpenCloseNum, g_nMaxIterationNum * 2 + 1, on_OpenClose);
    createTrackbar("迭代值", "【腐蝕/膨脹】", &g_nErodeDilateNum, g_nMaxIterationNum * 2 + 1, on_ErodeDilate);
    createTrackbar("迭代值", "【頂帽/黑帽】", &g_nTopBlackHatNum, g_nMaxIterationNum * 2 + 1, on_TopBlackHat);

    //輪詢獲取按鍵信息
    while (1)
    {
        int c;

        //執行回調函數
        on_OpenClose(g_nOpenCloseNum, 0);
        on_ErodeDilate(g_nErodeDilateNum, 0);
        on_TopBlackHat(g_nTopBlackHatNum, 0);

        //獲取按鍵
        c = waitKey(0);

        //按下鍵盤按鍵Q或者ESC,程序退出
        if ((char)c == 'q' || (char)c == 27)
            break;
        //按下鍵盤按鍵1,使用橢圓(Elliptic)結構元素結構元素MORPH_ELLIPSE
        if ((char)c == 49)//鍵盤按鍵1的ASII碼爲49
            g_nElementShape = MORPH_ELLIPSE;
        //按下鍵盤按鍵2,使用矩形(Rectangle)結構元素MORPH_RECT
        else if ((char)c == 50)//鍵盤按鍵2的ASII碼爲50
            g_nElementShape = MORPH_RECT;
        //按下鍵盤按鍵3,使用十字形(Cross-shaped)結構元素MORPH_CROSS
        else if ((char)c == 51)//鍵盤按鍵3的ASII碼爲51
            g_nElementShape = MORPH_CROSS;
        //按下鍵盤按鍵space,在矩形、橢圓、十字形結構元素中循環
        else if ((char)c == ' ')
            g_nElementShape = (g_nElementShape + 1) % 3;
    }

    return 0;
}


//-----------------------------------【on_OpenClose( )函數】----------------------------------
//        描述:【開運算/閉運算】窗口的回調函數
//-----------------------------------------------------------------------------------------------
static void on_OpenClose(int, void*)
{
    //偏移量的定義
    int offset = g_nOpenCloseNum - g_nMaxIterationNum;//偏移量
    int Absolute_offset = offset > 0 ? offset : -offset;//偏移量絕對值
    //自定義核
    Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset * 2 + 1, Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset));
    //進行操做
    if (offset < 0)
        //此句代碼的OpenCV2版爲:
        //morphologyEx(g_srcImage, g_dstImage, CV_MOP_OPEN, element);
        //此句代碼的OpenCV3版爲:
        morphologyEx(g_srcImage, g_dstImage, MORPH_OPEN, element);
    else
        //此句代碼的OpenCV2版爲:
        //morphologyEx(g_srcImage, g_dstImage, CV_MOP_CLOSE, element);
        //此句代碼的OpenCV3版爲:
        morphologyEx(g_srcImage, g_dstImage, MORPH_CLOSE, element);



    //顯示圖像
    imshow("【開運算/閉運算】", g_dstImage);
}


//-----------------------------------【on_ErodeDilate( )函數】----------------------------------
//        描述:【腐蝕/膨脹】窗口的回調函數
//-----------------------------------------------------------------------------------------------
static void on_ErodeDilate(int, void*)
{
    //偏移量的定義
    int offset = g_nErodeDilateNum - g_nMaxIterationNum;    //偏移量
    int Absolute_offset = offset > 0 ? offset : -offset;//偏移量絕對值
    //自定義核
    Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset * 2 + 1, Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset));
    //進行操做
    if (offset < 0)
        erode(g_srcImage, g_dstImage, element);
    else
        dilate(g_srcImage, g_dstImage, element);
    //顯示圖像
    imshow("【腐蝕/膨脹】", g_dstImage);
}


//-----------------------------------【on_TopBlackHat( )函數】--------------------------------
//        描述:【頂帽運算/黑帽運算】窗口的回調函數
//----------------------------------------------------------------------------------------------
static void on_TopBlackHat(int, void*)
{
    //偏移量的定義
    int offset = g_nTopBlackHatNum - g_nMaxIterationNum;//偏移量
    int Absolute_offset = offset > 0 ? offset : -offset;//偏移量絕對值
    //自定義核
    Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset * 2 + 1, Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset));
    //進行操做
    if (offset < 0)
        morphologyEx(g_srcImage, g_dstImage, MORPH_TOPHAT, element);
    else
        morphologyEx(g_srcImage, g_dstImage, MORPH_BLACKHAT, element);
    //顯示圖像
    imshow("【頂帽/黑帽】", g_dstImage);
}

//-----------------------------------【ShowHelpText( )函數】----------------------------------
//        描述:輸出一些幫助信息
//----------------------------------------------------------------------------------------------
static void ShowHelpText()
{
    //輸出一些幫助信息
    printf("\n\t請調整滾動條觀察圖像效果\n\n");
    printf("\n\t按鍵操做說明: \n\n"
        "\t\t鍵盤按鍵【ESC】或者【Q】- 退出程序\n"
        "\t\t鍵盤按鍵【1】- 使用橢圓(Elliptic)結構元素\n"
        "\t\t鍵盤按鍵【2】- 使用矩形(Rectangle )結構元素\n"
        "\t\t鍵盤按鍵【3】- 使用十字型(Cross-shaped)結構元素\n"
        "\t\t鍵盤按鍵【空格SPACE】- 在矩形、橢圓、十字形結構元素中循環\n");
}
相關文章
相關標籤/搜索