首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的箱形滤波算法

C++中的箱形滤波算法
EN

Stack Overflow用户
提问于 2014-09-20 10:14:43
回答 1查看 4.4K关注 0票数 1

我正在使用框过滤算法来做RGB图像模糊。但是结果真的很糟糕。我根本认不出原来的图像。图像的数据存储在一个数组Data[Width*Height*3]中,顺序为BGRBGRBGR...kernel是一个9x9的盒子。

下面是我的框过滤函数:

代码语言:javascript
复制
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;
}

有人能帮我找出我的实现出了什么问题吗?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-09-20 15:02:43

问题解决了。我忘了取回较低的8位并夹住了颜色。邮编在这里,以防有人需要它!

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25944552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档