Невозможно перебрать все пиксели прямоугольной матрицы изображений

#c #opencv

#c #opencv

Вопрос:

Я пытаюсь увеличить яркость загруженного изображения img , однако для перебора пикселей я использую меньшую матрицу [которую я буду использовать для применения размытия по Гауссу позже]. Вот моя функция:

 void Dobright(cv::Mat amp;in,IplImage * img)
{   
    uchar* temp_ptr ;
    for( int row = 0; row < in.rows; row  ) 
    {
            for ( int col = 0; col < in.cols; col  ) 
            {
                CvPoint pt = {row,col};
                temp_ptr  = amp;((uchar*)(img->imageData   img->widthStep*pt.y))[pt.x*3];
                temp_ptr[0]  = 100;
                temp_ptr[1]  = 100;
                temp_ptr[2]  = 100;
            }
    }
}
  

Однако, если исходное изображение было:

введите описание изображения здесь

Я получаю более яркое изображение как:

введите описание изображения здесь

Как вы можете видеть, некоторые части ярче других, и поскольку строки и столбцы не совпадают, следовательно, доступ к пикселям всего изображения недоступен, как решить эту проблему?

Комментарии:

1. Знаете ли вы, что существуют функции OpenCV для применения размытия по Гауссу, а также функция для масштабирования матриц? (например, cv::Mat::convert())

Ответ №1:

судя по всему, у вас перепутаны ширина и высота, попробуйте использовать:
CvPoint pt = {col,row};

также с вашим текущим алгоритмом вы столкнетесь с проблемами, когда исходные значения ваших пикселей будут > 155, (156 100 = 1) из-за округления. Попробуйте использовать

tmp_ptr[0] = (tmp_ptr > 155) ? 255 : tmp_ptr[0] 100;

Ответ №2:

Похоже, вы перевернули свои x и y здесь. Вы хотите, чтобы {col,row} CvPoint не {row,col} было.

Подумайте об этом так: третья строка, пятый столбец — это точка (5,3), а не точка (3,5).