C++ 拉普拉斯滤波器非常暗。几乎没有';行不通

C++ 拉普拉斯滤波器非常暗。几乎没有';行不通,c++,image-processing,gaussian,C++,Image Processing,Gaussian,我尝试实现拉普拉斯滤波器。我想我实现得不错,但它返回的图像非常暗。这是我的密码 值是具有像素值的数组。每个像素表示为三个值(rgb)。(值[0]=第一像素红色,值[1]=第一像素绿色,值[2]=第一像素蓝色,值[3]=第二像素红色e.t.c.) 数组索引/错误通道/错误指针/e.t.c.不会出错,因为我从工作正常的高斯滤波器复制了这部分 我使用整数数组存储eaxh像素的平均值,然后将它们缩放到0…255并复制到无符号字符数组。 在这里,我还添加了min/max、sum,我想,可能是将值缩放到0…

我尝试实现拉普拉斯滤波器。我想我实现得不错,但它返回的图像非常暗。这是我的密码

是具有像素值的数组。每个像素表示为三个值(rgb)。(
值[0]
=第一像素红色,
值[1]
=第一像素绿色,
值[2]
=第一像素蓝色,
值[3]
=第二像素红色e.t.c.) 数组索引/错误通道/错误指针/e.t.c.不会出错,因为我从工作正常的高斯滤波器复制了这部分

我使用整数数组存储eaxh像素的平均值,然后将它们缩放到0…255并复制到无符号字符数组。 在这里,我还添加了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);
        }
}
void-Laplacian::filter3x3(无符号字符*值、整数行、整数列){
无符号字符掩码[3][3]={{1,1,1},{1,-8,1},{1,1,1};
int*intValues=新的int[rows*cols];
//对于每个通道(RGB)。
对于(int c=0;c
似乎怀疑您在
未签名的
中有
-8

    values[i*cols + j] =(unsigned char)((intValues[i*cols + j] - min)/delta*255);
首先除以
delta
意味着你将得到一个小于1.0的分数,它将作为整数数学向下舍入为0,然后乘以255将不起任何作用

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

似乎怀疑您在
未签名的
中有
-8

    values[i*cols + j] =(unsigned char)((intValues[i*cols + j] - min)/delta*255);
首先除以
delta
意味着你将得到一个小于1.0的分数,它将作为整数数学向下舍入为0,然后乘以255将不起任何作用

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