如何应用梯度[-1 | 0 | 1]到RGB图像

Image Processing How to Apply gradient [-1 | 0 | 1 ] to RGB image

本文关键字:图像 RGB 何应用 应用      更新时间:2023-10-16

我需要对RGB位图图像应用梯度运算符。它适用于8位图像,但难以实现相同的24位图像。这是我的代码。有人知道吗校正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;
}

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

参见RGB图像的边缘检测器?

为了计算图像的梯度(这是一个矢量),您需要计算图像的水平和垂直导数。

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

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),它支持过滤图像,你就完成了。

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

好运。

从你的代码;你正试图从RGB计算梯度,但没有任何东西表明RGB是如何存储在你的图像中。一个完整的猜测是在你的图像中你有BGRBGRBGR…等等

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

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