Обработка изображений Как применить градиент [-1 | 0 | 1] в RGB изображение

Мне нужно применить оператор градиента к растровому изображению 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;
}

1

Решение

К сожалению, не ясно, как определить градиент изображения RGB. Лучший способ — преобразовать изображение в цветовое пространство, которое отделяет интенсивность от цвета, например HSV, и вычислить градиент компонента интенсивности. Кроме того, вы можете вычислить градиент каждого цветового канала отдельно, а затем объединить результаты каким-либо образом, например, взяв среднее значение.

Также см Краевые детекторы для изображений RGB?

1

Другие решения

Чтобы рассчитать градиент изображения (который является вектором), вам необходимо рассчитать как горизонтальную, так и вертикальную производные изображения.

Поскольку мы имеем дело с дискретным изображением, мы должны использовать конечно-разностные аппроксимации производной.
Есть много способов приблизиться, многие из них перечислены на страницах Википедии:

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), которая поддерживает фильтрацию изображений, и все готово.

Для цветных изображений, как правило, вы просто рассчитываете градиент для цветового канала.

Удачи.

0

Из вашего кода; Вы пытаетесь рассчитать градиент от RGB, но ничто не указывает на то, как RGB хранится в вашем изображении. Полное предположение состоит в том, что в вашем изображении у вас есть BGRBGRBGR … и т. Д.

В этом случае ваш код получает градиент от зеленого канала, а затем сохраняет его в красном цвете градиентного изображения. Вы не показываете, что градиентное изображение очищается до 0 — если вы этого не сделаете, то, вероятно, оно будет полно мусора.

Я предлагаю сначала преобразовать в изображение в оттенках серого; тогда вы можете использовать свой оригинальный код.
Или рассчитать градиент для каждого цветового канала.

0
По вопросам рекламы [email protected]