C++ 圖像處理(十)腐蝕與膨脹

腐蝕與膨脹只能適用(3 x 3)

可以修改成任意的形態腐蝕

原理:以後再補原理

代碼:

膨脹

//膨脹
void Morth_Dilet(QImage *image,QImage &out, int nTempH,int nTempW,int nTempMY,int nTempMX, int se[][3])
{


    bool bMatch;  //結構元素是否與局部圖像匹配
    Init_Image(out,255);
    int x,y;

    int w = image->width() - (nTempH-nTempMY) +1;
    int h = image->height() - (nTempW-nTempMX) +1;


    for(int i = nTempMY; i<h ; i++)
    {
        for(int j = nTempMX; j < w; j++)
        {
            bMatch = true;

            for(int k = 0; k < nTempH; k++)
            {
                for(int l = 0; l < nTempW; l++)
                {

                    x = j + l - nTempMX;
                    y = i + k - nTempMY;
                    int grey = qGray(image->pixel(x, y));

                    if(se[l][k] == -1)
                    {
                        continue;
                    }
                    if(se[l][k] == 1)
                    {
                        if(grey != 0)
                        {
                            bMatch = false;
                            break;
                        }
                    }
                    else if(se[l][k] == 0)
                    {
                        if(grey != 255)
                        {
                            bMatch = false;
                            break;
                        }
                    }
                    else {
                        return ;
                    }
                }
            }

            if(bMatch)
            {
                out.setPixel(j,i,qRgb(0, 0, 0));
            }
        }
    }
}

腐蝕:

//腐蝕
void Morth_Erode(QImage &image,QImage &out, int nTempH,int nTempW,int nTempMY,int nTempMX, int se[][3])
{

    QColor oldColor;


    int w = image.width() - (nTempH-nTempMY) +1;
    int h = image.height() - (nTempW-nTempMX) +1;
    int x,y;

    for(int i = nTempMY; i<h; i++)
    {
        for(int j = nTempMX; j < w; j++)
        {

            for(int k = 0; k < nTempH; k++)
            {
                for(int l = 0; l < nTempW; l++)
                {
                     x = j + l -nTempMX;
                     y = i + k - nTempMY;

                    int grey = qGray(image.pixel(x,y));

                    if(se[l][k] == -1)
                    {
                        continue;
                    }

                    if(se[l][k] == 1)
                    {


                        if(grey == 0)
                        {
                            out.setPixel(j,i,qRgb(0, 0, 0));
                            break;
                        }
                    }
                    else {
                        return ;
                    }
                }
            }

        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章