图像处理如何应用渐变[-1 | 0 | 1]到RGB图像

时间:2014-06-20 23:15:48

标签: c++ image-processing bitmap gradient

我需要将渐变运算符应用于RGB位图图像。它适用于8位图像,但难以实现24位图像。这是我的代码。任何人都可以看到如何 纠正zorizo​​ntal梯度操作到RGB图像。

if (iBitPerPixel == 24)  ////RGB 24 bits image
{

    for(int i=0; i<iHeight; i++)
    for(int j=1; j<iWidth-4; j++)
    {
        //pImg_Gradient[i*Wp+j] = pImg[i*Wp+j+1] - pImg[i*Wp+j-1] ;
        int level = pImg[i*Wp+j*3+1] - pImg[i*Wp+j*3-1] ;
        pImg_Gradient[i*Wp+j*3] = level;


    //  pImg_Gradient[i*Wp+j*3] =  level;
    //  pImg_Gradient[i*Wp+j*3+1] = level;
    //  pImg_Gradient[i*Wp+j*3+2]= level;
    }

    for(int i=0; i<iHeight; i++)
        for(int j=0; j<iWidth; j++)
    {
        // Copy the convetred values to original image.
        pImg[i*Wp+j] = (BYTE) pImg_Gradient[i*Wp+j];
    }
        //delete pImg_Gradient;
}

3 个答案:

答案 0 :(得分:1)

不幸的是,目前尚不清楚如何定义RGB图像的渐变。最好的方法是将图像转换为将强度与颜色分开的颜色空间,例如HSV,并计算强度分量的梯度。或者,您可以分别计算每个颜色通道的渐变,然后以某种方式组合结果,例如取平均值。

另见Edge detectors for RGB images?

答案 1 :(得分:0)

为了计算图像的渐变(矢量),您需要计算图像的水平和垂直导数。

由于我们处理的是离散图像,因此我们应该使用导数的Finitie差分近似值。
有许多方法可以近似,其中许多方法都列在维基百科页面上:

http://en.wikipedia.org/wiki/Finite_difference

http://en.wikipedia.org/wiki/Finite_difference_method

http://en.wikipedia.org/wiki/Finite_difference_coefficients

基本上这些是空间系数,因此您可以使用它们定义过滤器并只过滤图像 这将是计算梯度的最有效方法。

因此,您只需要找到一个支持过滤图像的库(例如Open CV)即可。

对于彩色图像,通常只计算每个颜色通道的渐变。

祝你好运。

答案 2 :(得分:0)

从你的代码;您正在尝试从RGB计算渐变,但没有任何内容可以指示RGB在图像中的存储方式。一个完整的猜测是,你的图像中有BGRBGRBGR ......等等。

在这种情况下,您的代码从绿色通道获取渐变,然后将其存储在渐变图像的红色中。您不会将渐变图像显示为0 - 如果您不这样做,那么它可能会充满垃圾。

我的建议是先转换为灰度图像;那么你可以使用你的原始代码。 或者为每个颜色通道计算一个渐变。