我需要将渐变运算符应用于RGB位图图像。它适用于8位图像,但难以实现24位图像。这是我的代码。任何人都可以看到如何 纠正zorizontal梯度操作到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;
}
答案 0 :(得分:1)
不幸的是,目前尚不清楚如何定义RGB图像的渐变。最好的方法是将图像转换为将强度与颜色分开的颜色空间,例如HSV,并计算强度分量的梯度。或者,您可以分别计算每个颜色通道的渐变,然后以某种方式组合结果,例如取平均值。
答案 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 - 如果您不这样做,那么它可能会充满垃圾。
我的建议是先转换为灰度图像;那么你可以使用你的原始代码。 或者为每个颜色通道计算一个渐变。