如何应用梯度[-1 | 0 | 1]到RGB图像
Image Processing How to Apply gradient [-1 | 0 | 1 ] to RGB image
我需要对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图像的边缘检测器?
为了计算图像的梯度(这是一个矢量),您需要计算图像的水平和垂直导数。
由于我们处理的是离散图像,我们应该使用导数的有限差分近似。
有许多近似的方法,其中许多都列在维基百科页面上:
基本上这些都是空间系数,因此你可以使用它们定义一个过滤器,过滤图像。
这将是计算梯度最有效的方法。
所以,你所需要的就是找到一个库(如Open CV),它支持过滤图像,你就完成了。
对于彩色图像,通常只需计算每个颜色通道的渐变。
好运。
从你的代码;你正试图从RGB计算梯度,但没有任何东西表明RGB是如何存储在你的图像中。一个完整的猜测是在你的图像中你有BGRBGRBGR…等等
在这种情况下,您的代码是从绿色通道获取渐变,然后将其存储在渐变图像的红色中。你没有显示渐变图像被清除为0 -如果你不这样做,那么它可能会充满垃圾。
我的建议是首先转换为灰度图像;然后可以使用原始代码。或者计算每个颜色通道的渐变。
相关文章:
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 将RGB图像保存为PPM格式
- Qt中的RGB图像处理
- 在RAW图像中提取RGB通道值的库或方法
- Qmage:如何将灰色图像转换为RGB热图
- 使用范围(OpenCV)脱粒RGB图像
- (C++)(Visual Studio) 将高斯模糊滤镜应用于 RGB 中的灰度图像
- 将JPEG流从IP摄像机接收到C 的RGB图像
- 如何从 GIFLIB 保存图像结构中获取 RGB 颜色数据
- RGB到XYZ,图像转换
- 如何将图像转换为C 中的RGB数据值
- 如何比较QT中的两个RGB图像
- 使用 ffmpeg 将平面 RGB 图像组合成无损视频
- 在RGB图像上执行阈值操作
- 将RGB颜色图像转换为OpenCV C 中的索引颜色图像类型
- 不能通过基于指针的访问像素强度来分割 RGB 图像
- 想要从图像获取绿色 RGB 通道时出错
- 表示RGB图像的浮点数组的初始CV::MAT
- 将 RGB 图像转换为 3 个 HSI 输出
- 将拜耳RGGB转换为CV图像(RGB)