Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/104: Рейтинг темы: голосов - 104, средняя оценка - 4.71
andech

Помогите с фильтром Собеля

22.09.2009, 20:18. Показов 20880. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно написать программу, которая бы обрабатывала изображение по фильтру Собеля(выделение границ на изображении). Вроде всё сделал по формулам, но у меня при обработке изображения выдаёт вот это. При применении фильтра Собеля на это же изображение в GIMP'е получается это.
Если кто-нибудь занимается изображениями помогите пожалуйста. Эту же прогу делал со scanline вместо попиксельного обращения, результат такой же.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include <tchar.h>
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
   int GX[3][3], GY[3][3], sumX = 0, sumY = 0, SUM = 0;
    Graphics::TBitmap *img = new Graphics::TBitmap;
    img->LoadFromFile("1.bmp");
 
   GX[3][3] = -1; GX[3][3] = 0; GX[3][3] = 1;
   GX[3][3] = -2; GX[3][3] = 0; GX[3][3] = 2;
   GX[3][3] = -1; GX[3][3] = 0; GX[3][3] = 1;
 
   GY[3][3] =  1; GY[3][3] = 2; GY[3][3] = 1;
   GY[3][3] =  0; GY[3][3] = 0; GY[3][3] = 0;
   GY[3][3] = -1; GY[3][3] = -2; GY[3][3] = -1;
 
    for (int Y = 0; Y < img->Height; Y++) {
        for (int X = 0; X < img->Width; X++) {
            sumX = 0;
            sumY = 0;
            if (Y == 0 || Y == img->Height)
                SUM = 0;
            else if (X == 0 || X == img->Width)
                SUM = 0;
            else {
                for (int I = -1; I <= 1; I++) {
                    for (int J = -1; J <= 1; J++) {
 
                        int piX = J + X;
                        int piY = I + Y;
 
                        COLORREF pixVal = img->Canvas->Pixels[piX][piY];
 
                        int R = GetRValue(pixVal);
                        int G = GetGValue(pixVal);
                        int B = GetBValue(pixVal);
 
                        int NC = (R + G + B) / 3;
 
                        sumX = sumX + (NC) * GX[J + 1][I + 1];
                        sumY = sumY + (NC) * GY[J + 1][I + 1];
                    }
                }
                SUM = sqrt(pow(sumX,2) + pow(sumY,2));
            }
            if (SUM > 255)
                SUM = 255;
            if (SUM < 0)
                SUM = 0;
            int newPixel = SUM;
            COLORREF newPixCol = RGB(newPixel, newPixel, newPixel);
            img->Canvas->Pixels[X][Y] = newPixCol;
        }
    }
    img->SaveToFile("2.bmp");
    return 0;
}
Миниатюры
Помогите с фильтром Собеля   Помогите с фильтром Собеля   Помогите с фильтром Собеля  

IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.09.2009, 20:18
Ответы с готовыми решениями:

Посчитать раздел границы фильтром Собеля и псевдомедианой
Здравствуйте, помогите пожалуйста. Мне нужно посчитать посчитать матрицу : 0 1 1 0 0 ...

Проблемы с фильтром Собеля
Друзья, помогите разобраться с неправильной отработкой фильтра Собеля. Реализовал матрицу Собеля по материалам из википедии, но сам...

ПОМОГИТЕ С ФИЛЬТРОМ
выбираю в combobox автомобиль из перечисленных выбирает имеено те, который я выбираю т.е они фильтруеться

4
 Аватар для Adler
80 / 85 / 19
Регистрация: 07.05.2009
Сообщений: 336
23.09.2009, 00:43
C++
1
2
3
4
5
6
7
8
   
   GX[3][3] = -1; GX[3][3] = 0; GX[3][3] = 1;
   GX[3][3] = -2; GX[3][3] = 0; GX[3][3] = 2;
   GX[3][3] = -1; GX[3][3] = 0; GX[3][3] = 1;
 
   GY[3][3] =  1; GY[3][3] = 2; GY[3][3] = 1;
   GY[3][3] =  0; GY[3][3] = 0; GY[3][3] = 0;
   GY[3][3] = -1; GY[3][3] = -2; GY[3][3] = -1;
я плохо представляю что это, но думаю должно быть так:
C++
1
2
3
4
5
6
7
   GX[0][0] = -1; GX[0][1] = 0; GX[0][2] = 1;
   GX[1][0] = -2; GX[1][1] = 0; GX[1][2] = 2;
   GX[2][0] = -1; GX[2][1] = 0; GX[2][2] = 1;
 
   GY[0][0] =  1; GY[0][1] = 2; GY[0][2] = 1;
   GY[1][0] =  0; GY[1][1] = 0; GY[1][2] = 0;
   GY[2][0] = -1; GY[2][1] = -2; GY[2][2] = -1;
Добавлено через 4 минуты
да, так оно и есть.
*почитал маны*
1
andech
25.09.2009, 15:00
Спасибо за помощь! Действительно что-то я реально с массивами ступил жестоко.
Теперь прога нормально работает даже с scanline. Выкладываю код, вдруг кому понадобится.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include <tchar.h>
#pragma argsused
Graphics::TBitmap *Sobel(Graphics::TBitmap *image);
int _tmain(int argc, _TCHAR* argv[])
{
    Graphics::TBitmap *img = new Graphics::TBitmap;
    img->LoadFromFile("1.bmp");
    Sobel(img)->SaveToFile("2.bmp");
    return 0;
}
 
Graphics::TBitmap *Sobel(Graphics::TBitmap *img) {
    Graphics::TBitmap *returnImage = new Graphics::TBitmap;
    returnImage->SetSize(img->Width, img->Height);
    returnImage->PixelFormat = pf24bit;
    Byte *ptr, *ptrup, *ptrdown, *ptrres, *ptrcur;
    int sumX = 0, sumY = 0;
    short SUM = 0;
 
    int GX[3][3]={{-1, 0, 1},
                 {-2, 0, 2},
                 {-1, 0, 1}};
 
    int GY[3][3]={{ 1, 2, 1},
                 { 0, 0, 0},
                 {-1,-2,-1}};
 
    for (int Y = 1; Y < img->Height - 1; Y++) {
        ptrres = (Byte*)returnImage->ScanLine[Y];
        ptr = (Byte*)img->ScanLine[Y];
        ptrup = (Byte*)img->ScanLine[Y - 1];
        ptrdown = (Byte*)img->ScanLine[Y + 1];
        for (int X = 0; X < 3 * img->Width; X += 3) {
            if (Y - 1 == 0 || Y + 1 == img->Height - 1) SUM = 0;
            else if (X == 0 || X == img->Width - 3) SUM = 0;
            else {
                sumX = 0;
                sumY = 0;
                for (int I = -1; I <= 1; I++) {
                    for (int J = -1; J <= 1; J++) {
                        switch(I) {
                        case -1:ptrcur = ptrup; break;
                        case 0:ptrcur = ptr; break;
                        case 1:ptrcur = ptrdown; break;
                        }
                        int piX = 3 * J + X;
                        int NC = 0.299 * ptrcur[piX + 2] + 0.587 * ptrcur
                            [piX + 1] + 0.114 * ptrcur[piX];
                        sumX = sumX + NC * GX[I + 1][J + 1];
                        sumY = sumY + NC * GY[I + 1][J + 1];
                    }
                }
                SUM = abs(sumX) + abs(sumY);
                if (SUM > 255) SUM = 255;
                if (SUM < 0) SUM = 0;
            }
            SUM = 255 - abs(SUM);
            ptrres[X + 2] = SUM;
            ptrres[X + 1] = SUM;
            ptrres[X] = SUM;
        }
    }
    return returnImage;
}
3 / 5 / 0
Регистрация: 09.12.2012
Сообщений: 104
11.04.2013, 19:21
Я в билдере запустил - программа не создает того, что надо. Только закрашивает в черный цвет 90% картинки.
0
 Аватар для Evgen192
1 / 1 / 0
Регистрация: 10.08.2013
Сообщений: 27
09.02.2014, 22:15
А может у кого то есть этот же фильтр Собеля но ток для C#? Очень нужно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.02.2014, 22:15
Помогаю со студенческими работами здесь

ПОМОГИТЕ, с расширенным фильтром
Ребята помогите пожайлуста не получается расширенный фильт, очень срочно надо. таблица и задание прилогается. зарание спасибо ))))

Помогите пожалуйста с фильтром (Table1->Filter) в С++ Builder.
У меня есть такой вопрос, как мне написать фильтр так, чтоб он мне вывел все значения которые находятся в поле. Например Table1-&gt;Filter...

Оператор Собеля
Народ выручайте очень нужен Алгоритм оператора собеля написанный на C#? Нужно для написания диплома. Заранее спасибо! Добавлено...

Функция Собеля
Нашел в НЕТе функцию Собеля, но не могу в не понять как исправить ошибку undefined symbol 'rgb' в строке rgb = new RGBColor*; void...

С++ и OpenCV. Оператор Собеля
#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; ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru