拉普拉斯滤波器非常暗。几乎不起作用

时间:2015-03-21 18:22:53

标签: c++ image-processing gaussian

我尝试实现拉普拉斯滤波器。我认为我实现了它,但它返回了非常暗的图像。这是我的代码。

values是一个包含像素值的数组。每个像素表示为三个值(rgb)。 (values[0] =第一像素RED,values[1] =第一像素GREEN,values[2] =第一像素BLUE,values[3] =第二像素RED e.t.c.) 对于数组indeces /错误的通道/错误的指针/ e.t.c,它不会出错。因为我从高斯滤波器复制了这部分工作正常。

我使用整数数组存储eaxh像素的平均值,然后将它们缩放到0 ... 255并复制到unsigned char数组。 在这里我还添加了min / max,sum,我想,也许,将值缩放到0 ... 255或某处溢出有问题... 请帮我找一个错误。或者我可能做错了什么?

void Laplacian::filter3x3(unsigned char* values, int rows, int cols){

unsigned char mask [3][3]= {{1, 1, 1},{1,-8, 1},{1, 1, 1}};  

int* intValues = new int[rows*cols];


// For each channel(RGB).
for(int c=0; c <= BLUE; ++c){
    int min = 8*255;
    int max = -8*255;
    for(int i=1; i<rows-1; i+=1){
        for(int j=c+3; j<cols-3; j+=3){
            double sum = 0;
            for(int x=-1; x<=1; ++x)
                for(int y=-1; y<=1; ++y){
                    sum += values[(i+x)*cols + j+y*3] * mask[x+1][y+1];
                }
            if(sum < min)
                min = sum;
            if(sum > max)
                max = sum;
            intValues[i*cols + j] = sum;
        }
    }
    int delta = max - min;
    std::cout<<"Delta: "<<delta<<"\tMin:  "<<min<<"\tMax:"<<max<<"\n";
    for(int i=1; i<rows-1; i+=1)
        for(int j=c+3; j<cols-3; j+=3){
            values[i*cols + j] =(unsigned char)((intValues[i*cols + j] - min)/delta*255);
        }
}

}

这是图片样本:输入和输出。

enter image description here enter image description here

并使用最小/最大/增量值控制屏幕截图(红色,然后是绿色,然后是蓝色)。看起来他们工作正常。 enter image description here

还有另一种方法来规范化价值观吗?

1 个答案:

答案 0 :(得分:4)

    unsigned char mask [3][3]= {{1, 1, 1},{1,-8, 1},{1, 1, 1}};

看起来您怀疑-8中有unsigned

    values[i*cols + j] =(unsigned char)((intValues[i*cols + j] - min)/delta*255);

首先除以delta意味着你将产生一个分数&lt; 1&gt; 1.0,将整数数学舍入为0,然后乘以255将无效。

如果你做* 255 / delta,只要中间值不溢出(这似乎是合理的),你就可以避免这个问题。