Мне нужно применить оператор градиента к растровому изображению 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, и вычислить градиент компонента интенсивности. Кроме того, вы можете вычислить градиент каждого цветового канала отдельно, а затем объединить результаты каким-либо образом, например, взяв среднее значение.
Чтобы рассчитать градиент изображения (который является вектором), вам необходимо рассчитать как горизонтальную, так и вертикальную производные изображения.
Поскольку мы имеем дело с дискретным изображением, мы должны использовать конечно-разностные аппроксимации производной.
Есть много способов приблизиться, многие из них перечислены на страницах Википедии:
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 — если вы этого не сделаете, то, вероятно, оно будет полно мусора.
Я предлагаю сначала преобразовать в изображение в оттенках серого; тогда вы можете использовать свой оригинальный код.
Или рассчитать градиент для каждого цветового канала.