形態學操作(針對灰度圖像)


針對灰度圖像

1. 腐蝕

實現:在圖像f中的某一像素點,以結構元素B的中心位置處對應該像素點, 若以該像素點為中心,尋找在結構元素B大小覆蓋的鄰域范圍內(圖像f上) 的最小值來代替該點像素值,作為腐蝕后對應位置的像素;簡言之,鄰域內(局部)最小值來代替該點像素。

主要作用:腐蝕過的圖像一般背景比原圖像要稍暗一些,比結構元b小的亮度特征被腐蝕掉了;

c++實現代碼:

void gray_erode(Mat &src, Mat &dst, int n) 
{
    std::vector<float> winTotal;
    src.copyTo(dst);

    int windows_size = n*n;
    int edge = n / 2;

    for (int i = edge; i < src.rows - edge; i++)
    {
        uchar * dstptr = dst.ptr(i);

        for (int j = edge; j < src.cols - edge; j++)
        {

            winTotal.clear();
            for (int x = -edge; x <= edge; x++)
            {
                for (int y = -edge; y <= edge; y++)
                {
                    winTotal.push_back(src.at<uchar>(i + x, j + y));
                }
            }

            std::sort(winTotal.begin(), winTotal.end());

            /*for (int t = 0; t < winTotal.size(); t++) 
                cout << t << ",      " << winTotal[t] << endl;*/

            dstptr[j] = winTotal[0];
            
        }

    }
}
View Code

2. 膨脹

實現:參考上述腐蝕的實現,只不過這里是用局部最大值來代替;

c++實現代碼:

void gray_dilate(Mat &src, Mat &dst, int n)
{
    std::vector<float> winTotal;
    src.copyTo(dst);

    int windows_size = n*n;
    int edge = n / 2;

    for (int i = edge; i < src.rows - edge; i++)
    {
        uchar * dstptr = dst.ptr(i);

        for (int j = edge; j < src.cols - edge; j++)
        {
            winTotal.clear();
            for (int x = -edge; x <= edge; x++)
            {
                for (int y = -edge; y <= edge; y++)
                {
                    winTotal.push_back(src.at<uchar>(i + x, j + y));
                }
            }

            std::sort(winTotal.begin(), winTotal.end());

            /*for (int t = 0; t < winTotal.size(); t++)
            cout << t << ",      " << winTotal[t] << endl;*/

            dstptr[j] = winTotal[winTotal.size()-1];
        }

    }
}
View Code

3. 開操作

實現:先腐蝕(局部最小值),后膨脹(局部最大值);

主要作用:開操作用於去除較小的明亮細節,而保持整體灰度級和較大的明亮特征相對不變;

c++實現代碼:

void gray_openOperation(Mat &src, Mat &dst, int n) 
{
    Mat src_temp;
    gray_erode(src, src_temp, n);
    gray_dilate(src_temp, dst, n);
}
View Code

4. 閉操作

實現:先膨脹(局部最大值),后腐蝕(局部最小值);

主要作用:閉操作主要用於削弱暗特征,削弱的程度取決於這些特征相對於結構元的尺寸,而亮的細節和背景相對來說未受影響;

c++實現代碼:

void gray_closeOperation(Mat &src, Mat &dst, int n)
{
    Mat src_temp;
    gray_dilate(src, src_temp, n);
    gray_erode(src_temp, dst, n);
}
View Code

5. 頂帽變換

實現:圖像f減去其開操作;

主要作用:頂帽變換用於暗背景上的亮物體(有待后續完善...);

c++實現代碼:

void gray_topHat(Mat &src, Mat &dst, int n) 
{
    Mat src_temp;
    gray_openOperation(src, src_temp, n);

    if (src.rows == src_temp.rows && src.cols == src_temp.cols
        && src.type() == src_temp.type()) 
    {
        subtract(src, src_temp, dst);
    }
}
View Code

6. 底帽操作

實現:圖像f的閉操作減去圖像f;

主要作用:底帽作用用於亮背景上的暗物體(有待后續完善...)

c++實現代碼:

void gray_bottomCap(Mat &src, Mat &dst, int n) 
{
    Mat src_temp;
    gray_closeOperation(src, src_temp, n);

    if (src.rows == src_temp.rows && src.cols == src_temp.cols
        && src.type() == src_temp.type())
    {
        subtract(src_temp, src, dst);
    }

}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM