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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Кукарача
0 / 0 / 0
Регистрация: 14.12.2012
Сообщений: 9
#1

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

23.12.2012, 16:28. Просмотров 1169. Ответов 7
Метки нет (Все метки)

Привет, дано матрицу, каждый елемент которой -значение интенсивности пикселя изображения. Размер матрицы задается, заполняеться случайными числами(до 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++):

С++ и OpenCV. Оператор Собеля - C++
#include &lt;cv.h&gt; #include &lt;highgui.h&gt; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; IplImage* image = 0; IplImage* dst = 0; ...

Дана матрица размера M × N. Для каждого столбца матрицы с четным номером (2, 4, …) найти сумму его элементов. Условный оператор не использовать. - C++
Дана матрица размера M × N. Для каждого столбца матрицы с четным номером (2, 4, …) найти сумму его элементов. Условный оператор не...

Переписать программу так, чтобы для вывода на экран каждого операнда использовался отдельный оператор - C++
Читаю учебник C++, не могу разобраться с задачей, прошу помощи. Код: #include &lt;iostream&gt; int main() { std::cout &lt;&lt; &quot;Programma...

Для заданной матрицы определить среднее арифметическое значение для каждого столбца - C++
1. Определить среднее арифметическое значение элементов массива F ( n ) , которые удовлетворяют требованию -3 &lt;= f(i) &lt;= 5 . Если таких...

Как перегрузить оператор [][] для разреженной матрицы? - C++
как перегрузить оператор для разреженной матрицы?знаю, что такого оператора нет, есть только , но все равно не понимаю как его перегрузить

Не работает перегруженный оператор + для класса динамической матрицы - C++
Подскажите, почему не работает перегруженный + для складывания двух матриц одного размера. #include &lt;iostream&gt; #include &lt;iomanip&gt;...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
23.12.2012, 22:41 #4
при i = 0
i-1 будет выходом за пределы массива
аналогично для j
и с другим концом массива то же самое
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
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 и т.д.
Кукарача
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;
Может только можно как-то по-красивее написать?)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2012, 01:44
Привет! Вот еще темы с ответами:

Класс для работы с прямоугольной матрицей, ввод матрицы с консоли (оператор >>) - C++
ввести класс для работы с прямоугольной матрицей(3х3) Реализовать операцию : ввод матрицы с консоли (оператор &gt;&gt;)продемонстрируйте...

Отсортировать элементы матрицы по возрастанию для каждого столбца - C++
Создать функцию, которая отсортировка элементы матрицы по возрастанию для каждого столбца и находит минимальный элемент.

Найти среднее геометрическое значение для каждого столбца матрицы - C++
Дана матрица целых чисел E . Используя функцию, найти среднее геометрическое значение для каждого столбца матрицы.

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.12.2012, 01:44
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru