Форум программистов, компьютерный форум CyberForum.ru

Оператор Собеля для каждого елемента матрицы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Кукарача
0 / 0 / 0
Регистрация: 14.12.2012
Сообщений: 9
23.12.2012, 16:28     Оператор Собеля для каждого елемента матрицы #1
Привет, дано матрицу, каждый елемент которой -значение интенсивности пикселя изображения. Размер матрицы задается, заполняеться случайными числами(до 255) , и для каждого елемента нужно высчитать оператор Собеля-G[i][j]. В нем есть горизонтальная(Gx) и вертикальная(Gy) слагаемые.

Gx[i][j]= mas[i-1][j-1] + 2*mas[i-1][j] + mas[i-1][j+1] – mas[i+1][j-1] – 2*mas[i+1][j] - mas[i+1][j+1].
Gy[i][j]= mas[i-1][j-1] + 2*mas[i][j-1] + mas[i+1][j-1] – mas[i-1][j+1] – 2*mas[i][j+1] - mas[i+1][j+1].

A G[i][j]- корень из суммы их квадратов.
Операторы для каждого елемента нужно вывести ввиде соответствующей матрицы.
Если i=0, допустим, то [i-1] = последнему елементу, если i = n-1, то [i+1] = [0] и т.д.

Вот код,моя рандомная матрица выводиться,а дальше программа вылетает
Код
#include <iostream>
#include <ctime>
#include <conio.h>
#include <stdlib.h>
#include <math.h>

using namespace std;

void MatrixOut(int **MATRIX, int COLUMNS, int ROWS);
int SobelGradient(int **matrix, int COLUMNS, int ROWS);

int main()
{
   int columns, rows;

   cout << "Input the size of matrix\n";
   cin >> columns >> rows;


   int **matrix=new int *[columns];
   for(int i=0; i<columns; i++){
    matrix[i]= new int [rows];
   }


   srand(time(0));
   for(int i=0; i<columns; i++){
    for(int u=0; u<rows; u++){
     matrix[i][u]=rand()%255 +1;
    }
   }

  MatrixOut (matrix, columns, rows);
  SobelGradient(matrix, columns, rows);
}


 void MatrixOut(int **MATRIX, int COLUMNS, int ROWS){
  for (int y=0; y<ROWS; y++) {
   for (int x=0; x<COLUMNS; x++) {
    cout << MATRIX[y][x] << "\t";
   }
  cout << endl;
  }
}


int SobelGradient(int **matrix, int COLUMNS, int ROWS){

  int Gx, Gy, G;
  for(int i=0; i<COLUMNS; i++){
   for (int j=0; j<ROWS; j++){

    if(i=0){matrix[i-1][j-1]=matrix[COLUMNS-1][j-1];
            matrix[i-1][j+1]=matrix[COLUMNS-1][j+1];
            matrix[i-1][j]=matrix[COLUMNS-1][j];
           }
    if(i=COLUMNS-1){matrix[i+1][j-1]=matrix[0][j-1];
                    matrix[i+1][j+1]=matrix[0][j+1];
                    matrix[i+1][j]=matrix[0][j];
                   }
    if(j=0){matrix[i-1][j-1]=matrix[i-1][ROWS-1];
            matrix[i+1][j-1]=matrix[i+1][ROWS-1];
            matrix[i][j-1]=matrix[i][ROWS-1];
           }
    if(j=ROWS-1){matrix[i-1][j+1]=matrix[i-1][0];
                 matrix[i+1][j+1]=matrix[i+1][0];
                 matrix[i][j+1]=matrix[i][0];
                }
    Gy=matrix[i-1][j-1] +2*matrix[i][j-1] +matrix[i+1][j-1] -matrix[i-1][j+1] -2*matrix[i][j+1] -matrix[i+1][j+1];
    Gx=matrix[i-1][j-1] +2*matrix[i-1][j] +matrix[i-1][j+1] -matrix[i+1][j-1] -2*matrix[i+1][j] -matrix[i+1][j+1];
    G=sqrt(pow(Gy,2)+pow(Gx,2));
    cout << G << "\t";
   }
   cout << endl;

   }
  }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2012, 16:28     Оператор Собеля для каждого елемента матрицы
Посмотрите здесь:

C++ Для каждого столбца матрицы найти произведение его элементов
Для каждого столбца матрицы найти произведение его элементов. C++
Дана матрица размера M × N. Для каждого столбца матрицы с четным номером (2, 4, …) найти сумму его элементов. Условный оператор не использовать. C++
C++ С++ и OpenCV. Оператор Собеля
Для каждого столбца матрицы найти значение и индекс максимального элемента C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
23.12.2012, 17:26     Оператор Собеля для каждого елемента матрицы #2
условие "равно" в if пишется
==
а не
=
Кукарача
0 / 0 / 0
Регистрация: 14.12.2012
Сообщений: 9
23.12.2012, 17:45  [ТС]     Оператор Собеля для каждого елемента матрицы #3
спасибо, поменяла на "==", но в итоге все-равно вылетает
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
23.12.2012, 22:41     Оператор Собеля для каждого елемента матрицы #4
при i = 0
i-1 будет выходом за пределы массива
аналогично для j
и с другим концом массива то же самое
Nagdiel
 Аватар для Nagdiel
114 / 114 / 3
Регистрация: 23.12.2012
Сообщений: 195
23.12.2012, 22:59     Оператор Собеля для каждого елемента матрицы #5
Сдается мне, проблема в том, что при i==0, или j==0 выполняется обращение к элементам матрицы с индексами (i-1), или, соответсвенно, - (j-1).
Кукарача
0 / 0 / 0
Регистрация: 14.12.2012
Сообщений: 9
24.12.2012, 00:06  [ТС]     Оператор Собеля для каждого елемента матрицы #6
изменила так, чтобы при i==0 i-1 вообще не прозвучало, и с прочими, но все-тоже
Код
for(int i=0; i<COLUMNS; i++){
   for (int j=0; j<ROWS; j++){


     if(i==0 && j==0){ Gy=matrix[COLUMNS-1][ROWS-1] +2*matrix[i][ROWS-1] +matrix[i+1][ROWS-1] -matrix[COLUMNS-1][j+1] -2*matrix[i][j+1] -matrix[i+1][j+1];
                       Gx=matrix[COLUMNS-1][ROWS-1] +2*matrix[COLUMNS-1][j] +matrix[COLUMNS-1][j+1] -matrix[i+1][ROWS-1] -2*matrix[i+1][j] -matrix[i+1][j+1];
                     }

     if(i==COLUMNS-1 && j==ROWS-1){  Gy=matrix[i-1][j-1] +2*matrix[i][j-1] +matrix[0][j-1] -matrix[i-1][0] -2*matrix[i][0] -matrix[0][0];
                                     Gx=matrix[i-1][j-1] +2*matrix[i-1][j] +matrix[i-1][0] -matrix[0][j-1] -2*matrix[0][j] -matrix[0][0];
                                  }

     if(i==0)        { Gy=matrix[COLUMNS-1][j-1] +2*matrix[i][j-1] +matrix[i+1][j-1] -matrix[COLUMNS-1][j+1] -2*matrix[i][j+1] -matrix[i+1][j+1];
                      Gx=matrix[COLUMNS-1][j-1] +2*matrix[COLUMNS-1][j] +matrix[COLUMNS-1][j+1] -matrix[i+1][j-1] -2*matrix[i+1][j] -matrix[i+1][j+1];
                    }

     if(i==COLUMNS-1){ Gy=matrix[i-1][j-1] +2*matrix[i][j-1] +matrix[0][j-1] -matrix[i-1][j+1] -2*matrix[i][j+1] -matrix[0][j+1];
                      Gx=matrix[i-1][j-1] +2*matrix[i-1][j] +matrix[i-1][j+1] -matrix[0][j-1] -2*matrix[0][j] -matrix[0][j+1];
                    }

     if(j==0)        { Gy=matrix[i-1][ROWS-1] +2*matrix[i][ROWS-1] +matrix[i+1][ROWS-1] -matrix[i-1][j+1] -2*matrix[i][j+1] -matrix[i+1][j+1];
                      Gx=matrix[i-1][ROWS-1] +2*matrix[i-1][j] +matrix[i-1][j+1] -matrix[i+1][ROWS-1] -2*matrix[i+1][j] -matrix[i+1][j+1];
                    }

     if(j==ROWS-1)  { Gy=matrix[i-1][j-1] +2*matrix[i][j-1] +matrix[i+1][j-1] -matrix[i-1][0] -2*matrix[i][0] -matrix[i+1][0];
                      Gx=matrix[i-1][j-1] +2*matrix[i-1][j] +matrix[i-1][0] -matrix[i+1][j-1] -2*matrix[i+1][j] -matrix[i+1][0];
                    }

      Gy=matrix[i-1][j-1] +2*matrix[i][j-1] +matrix[i+1][j-1] -matrix[i-1][j+1] -2*matrix[i][j+1] -matrix[i+1][j+1];
      Gx=matrix[i-1][j-1] +2*matrix[i-1][j] +matrix[i-1][j+1] -matrix[i+1][j-1] -2*matrix[i+1][j] -matrix[i+1][j+1];
    }

    G=sqrt(pow(Gy,2)+pow(Gx,2));
    cout << G << "\t";
   }
   cout << endl;

   }
Nagdiel
 Аватар для Nagdiel
114 / 114 / 3
Регистрация: 23.12.2012
Сообщений: 195
24.12.2012, 00:31     Оператор Собеля для каждого елемента матрицы #7
А как же эти строчки в конце вложенного цикла?

C++
1
2
Gy=matrix[i-1][j-1] +2*matrix[i][j-1] +matrix[i+1][j-1] -matrix[i-1][j+1] -2*matrix[i][j+1] -matrix[i+1][j+1];
Gx=matrix[i-1][j-1] +2*matrix[i-1][j] +matrix[i-1][j+1] -matrix[i+1][j-1] -2*matrix[i+1][j] -matrix[i+1][j+1];
Тут всё еще имеет место выход индексов за границы массива.

Добавлено через 12 минут
Я так понимаю, по логике в конце каждого блока if должен стоять оператор continue. Тогда, после выполнения блока, будет осуществлен переход к следующей итерации. Без этого в любом случае будут выполняться две последние строчки вложенного цилка for, в том числе при i=0, j=0 и т.д.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2012, 01:44     Оператор Собеля для каждого елемента матрицы
Еще ссылки по теме:

C++ Для каждого столбца матрицы найти первый положительный элемент
C++ Найти среднее геометрическое значение для каждого столбца матрицы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Кукарача
0 / 0 / 0
Регистрация: 14.12.2012
Сообщений: 9
24.12.2012, 01:44  [ТС]     Оператор Собеля для каждого елемента матрицы #8
Дописала
Код
if(i!=0 && i!=COLUMNS-1 && j!=0 && j!=ROWS-1){
      Gy=matrix[i-1][j-1] +2*matrix[i][j-1] +matrix[i+1][j-1] -matrix[i-1][j+1] -2*matrix[i][j+1] -matrix[i+1][j+1];
      Gx=matrix[i-1][j-1] +2*matrix[i-1][j] +matrix[i-1][j+1] -matrix[i+1][j-1] -2*matrix[i+1][j] -matrix[i+1][j+1];
    }
все-равно не выходит.
Если я вас не поняла, напишите как правильно, пожалуйста.

Добавлено через 3 минуты
ок, пойду читать про continue,спасибо

Добавлено через 1 час 8 минут
Вот она, функция моей мечты
Код
int SobelGradient(int **matrix, int COLUMNS, int ROWS){

  int Gx, Gy, G;

  for(int i=0; i<COLUMNS; i++){
   for (int j=0; j<ROWS; j++){


     if(i==0 && j==0){ Gy=matrix[COLUMNS-1][ROWS-1] +2*matrix[i][ROWS-1] +matrix[i+1][ROWS-1] -matrix[COLUMNS-1][j+1] -2*matrix[i][j+1] -matrix[i+1][j+1];
                       Gx=matrix[COLUMNS-1][ROWS-1] +2*matrix[COLUMNS-1][j] +matrix[COLUMNS-1][j+1] -matrix[i+1][ROWS-1] -2*matrix[i+1][j] -matrix[i+1][j+1];
                       G=sqrt(pow(Gy,2)+pow(Gx,2));
                       cout << G << "\t";
                       continue;
                     }

     if(i==COLUMNS-1 && j==ROWS-1){  Gy=matrix[i-1][j-1] +2*matrix[i][j-1] +matrix[0][j-1] -matrix[i-1][0] -2*matrix[i][0] -matrix[0][0];
                                     Gx=matrix[i-1][j-1] +2*matrix[i-1][j] +matrix[i-1][0] -matrix[0][j-1] -2*matrix[0][j] -matrix[0][0];
                                     G=sqrt(pow(Gy,2)+pow(Gx,2));
                                     cout << G << "\t";
                                     continue;
                                  }

     if(i==0 && j==ROWS-1)        { Gy=matrix[COLUMNS-1][j-1] +2*matrix[i][j-1] +matrix[i+1][j-1] -matrix[COLUMNS-1][0] -2*matrix[i][0] -matrix[i+1][0];
                                    Gx=matrix[COLUMNS-1][j-1] +2*matrix[COLUMNS-1][j] +matrix[COLUMNS-1][0] -matrix[i+1][j-1] -2*matrix[i+1][j] -matrix[i+1][0];
                                    G=sqrt(pow(Gy,2)+pow(Gx,2));
                                    cout << G << "\t";
                                    continue; }

     if(i==COLUMNS-1 && j==0)     {  Gy=matrix[i-1][ROWS-1] +2*matrix[i][ROWS-1] +matrix[0][ROWS-1] -matrix[i-1][j+1] -2*matrix[i][j+1] -matrix[0][j+1];
                                     Gx=matrix[i-1][ROWS-1] +2*matrix[i-1][j] +matrix[i-1][j+1] -matrix[0][ROWS-1] -2*matrix[0][j] -matrix[0][j+1];
                                     G=sqrt(pow(Gy,2)+pow(Gx,2));
                                     cout << G << "\t";
                                     continue; }

     if(i==0)                     { Gy=matrix[COLUMNS-1][j-1] +2*matrix[i][j-1] +matrix[i+1][j-1] -matrix[COLUMNS-1][j+1] -2*matrix[i][j+1] -matrix[i+1][j+1];
                                    Gx=matrix[COLUMNS-1][j-1] +2*matrix[COLUMNS-1][j] +matrix[COLUMNS-1][j+1] -matrix[i+1][j-1] -2*matrix[i+1][j] -matrix[i+1][j+1];
                                    G=sqrt(pow(Gy,2)+pow(Gx,2));
                                    cout << G << "\t";
                                    continue; }

     if(i==COLUMNS-1)             { Gy=matrix[i-1][j-1] +2*matrix[i][j-1] +matrix[0][j-1] -matrix[i-1][j+1] -2*matrix[i][j+1] -matrix[0][j+1];
                                    Gx=matrix[i-1][j-1] +2*matrix[i-1][j] +matrix[i-1][j+1] -matrix[0][j-1] -2*matrix[0][j] -matrix[0][j+1];
                                    G=sqrt(pow(Gy,2)+pow(Gx,2));
                                    cout << G << "\t";
                                    continue; }

     if(j==0)                     { Gy=matrix[i-1][ROWS-1] +2*matrix[i][ROWS-1] +matrix[i+1][ROWS-1] -matrix[i-1][j+1] -2*matrix[i][j+1] -matrix[i+1][j+1];
                                    Gx=matrix[i-1][ROWS-1] +2*matrix[i-1][j] +matrix[i-1][j+1] -matrix[i+1][ROWS-1] -2*matrix[i+1][j] -matrix[i+1][j+1];
                                    G=sqrt(pow(Gy,2)+pow(Gx,2));
                                    cout << G << "\t";
                                    continue; }

     if(j==ROWS-1)                { Gy=matrix[i-1][j-1] +2*matrix[i][j-1] +matrix[i+1][j-1] -matrix[i-1][0] -2*matrix[i][0] -matrix[i+1][0];
                                    Gx=matrix[i-1][j-1] +2*matrix[i-1][j] +matrix[i-1][0] -matrix[i+1][j-1] -2*matrix[i+1][j] -matrix[i+1][0];
                                    G=sqrt(pow(Gy,2)+pow(Gx,2));
                                    cout << G << "\t";
                                    continue;  }

      Gy=matrix[i-1][j-1] +2*matrix[i][j-1] +matrix[i+1][j-1] -matrix[i-1][j+1] -2*matrix[i][j+1] -matrix[i+1][j+1];
      Gx=matrix[i-1][j-1] +2*matrix[i-1][j] +matrix[i-1][j+1] -matrix[i+1][j-1] -2*matrix[i+1][j] -matrix[i+1][j+1];


    G=sqrt(pow(Gy,2)+pow(Gx,2));
    cout << G << "\t";
   }
   cout << endl;
Может только можно как-то по-красивее написать?)
Yandex
Объявления
24.12.2012, 01:44     Оператор Собеля для каждого елемента матрицы
Ответ Создать тему
Опции темы

Текущее время: 08:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru