【问题标题】:Box Filtering Algorithm in C++C++ 中的框过滤算法
【发布时间】:2014-11-14 16:13:43
【问题描述】:

我正在使用框过滤算法来进行 RGB 图像模糊。但结果真的很糟糕。我根本无法识别原始图像。 图片的数据存储在数组Data[Width*Height*3]中,顺序为BGRBGRBGR……而kernel是一个9x9的盒子。

这是我的盒子过滤功能:

void MyImage::BoxFiltering(vector<int> kernel){
char *temp = new char[Width * Height * 3];

int denominator = 0;
int indexOffset;
int red = 0, blue = 0, green = 0;

int indices[] = {-(Width + 1), -Width, -(Width - 1),
                 - 1,          0,      1,
                 Width - 1,    Width,  Width + 1};

for(int i = 0; i < kernel.size(); ++i){
    denominator += kernel[i];
}


if(denominator == 0)
    denominator = 1;

//Copy Data
for(int i = 0; i < Width * Height * 3; ++i){
    temp[i] = Data[i];
}

for(int i = 1; i < Height - 1; ++i){
    for(int j = 1; j < Width - 1; ++j){
        //Get Pixel Index
        indexOffset = getIndex(j, i);

        for(int k = 0; k < kernel.size(); ++k){
            blue    += Data[3 * (indexOffset + indices[k])] * kernel[k];
            green   += Data[3 * (indexOffset + indices[k]) + 1] * kernel[k];
            red     += Data[3 * (indexOffset + indices[k]) + 2] * kernel[k];
        }

        temp[3 * indexOffset] = static_cast<char>(blue / denominator);
        temp[3 * indexOffset + 1] = static_cast<char>(green / denominator);
        temp[3 * indexOffset + 2] = static_cast<char>(red / denominator);
    }
}

for(int i = 0; i < Width * Height * 3; ++i){
    Data[i] = temp[i];
}

delete [] temp;
}

谁能帮我弄清楚我的实现有什么问题?谢谢!

【问题讨论】:

    标签: c++ algorithm image-processing


    【解决方案1】:

    问题已解决。 我忘了取回低 8 位并夹住颜色。在这里发布代码以防有人需要!

    for(int i = 1; i <= Height - 1; ++i){
        for(int j = 1; j <= Width - 1; ++j){
            //Get Pixel Index
            indexOffset = getIndex(j, i);
    
            for(int k = 0; k < kernel.size(); ++k){
    
                blue    += (Data[3 * (indexOffset + indices[k])]     * kernel[k])  & 0xff;
                green   += (Data[3 * (indexOffset + indices[k]) + 1]  * kernel[k]) & 0xff;
                red     += (Data[3 * (indexOffset + indices[k]) + 2]  * kernel[k]) & 0xff;
            }
    
            blue    /= denominator;
            green   /= denominator;
            red     /= denominator;
    
            if (red>0xff) 
                red = 0xff ;
            else if (red<0) 
                red = 0 ;
            if (green>0xff) 
                green = 0xff ;
            else if (green<0) 
                green = 0 ;
            if (blue>0xff) 
                blue = 0xff ;
            else if (blue<0) 
                blue = 0 ; 
    
    
            temp[3 * indexOffset]     = static_cast<char>(blue);
            temp[3 * indexOffset + 1] = static_cast<char>(green);
            temp[3 * indexOffset + 2] = static_cast<char>(red);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 2012-02-12
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 2010-10-19
      相关资源
      最近更新 更多