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

Разбить изображение по яркости - C++

Восстановить пароль Регистрация
 
belka32
0 / 0 / 0
Регистрация: 21.09.2014
Сообщений: 51
15.11.2015, 12:58     Разбить изображение по яркости #1
Я пытаюсь разбить чёрно-белое изображение на небольшие участки схожие по яркости.
Я выбираю параметр p и 2 точки(в начале алгоритма, это точки (0;0) и (1;0)).
И если модуль разности яркости первой точки и яркости второй точки будут меньше p, то меняю вторую точку на (x2+1, y2)(когда строка закончилась меняю y2 на единицу)(т.е. прохожу по всем точкам начиная с 0 строки и заканчивая последней).
Если модуль разности больше то развиваю участок изображения на 2. и задаю этим участкам точки начала и конца(т.е. левую верхнюю и правую нижнюю).
И так буду делать пока не будут просмотрены все новые участки.
Но этот алгоритм долго работает. Как можно изменить его? Или чем можно заменить его?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2015, 12:58     Разбить изображение по яркости
Посмотрите здесь:

разбить класс C++
Разбить строку C++
C++ Разбить на функции
Разбить строку C++
C++ Разбить строку
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
15.11.2015, 14:00     Разбить изображение по яркости #2
Я не понял описанного алгоритма, но для "разбить изображение на участки..." есть в OpenCV метод kmeans.
belka32
0 / 0 / 0
Регистрация: 21.09.2014
Сообщений: 51
15.11.2015, 14:48  [ТС]     Разбить изображение по яркости #3
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
public ref class Cell{
 
    short  x1, x2, y1, y2;
    PartIm * h;
    int deep;
    int high;
 
public:
     Cell (int n, short X1, short  Y1, short  X2, short Y2){
        deep = -1;
        high = n;
        h = nullptr;
        x1 = X1;
        y1 = Y1;
        x2 = X2;
        y2 = Y2;
        
 
    }
     void CellInit(int n, short X1, short  Y1, short  X2, short Y2){
         deep = -1;
         high = n;
         h = nullptr;
         x1 = X1;
         y1 = Y1;
         x2 = X2;
         y2 = Y2;
        
 
     }
        short GetX1(){ return x1; }
    short GetX2(){ return x2; }
    short GetY1(){ return y1; }
    short GetY2(){ return y2; }
    
}
А вот и алгоритм:
 
        dif=100;// разность по яркости
        int n=1;//кол-во эл-ов в списке
        List <Cell ^> ^ list;
    list = gcnew List<Cell ^>();
    list->Clear();
    list->Add(gcnew Cell (-1, 0, 0, 255, 255));
        for (int i = 0; i <= n - 1; i++)
            
{
        bool t = false; short x1, x2, y1, y2;
    for (y1 = list[i]->GetY1(); y1 <= list[i]->GetY2() && t == false; ++y1)
        for (x1 = list[i]->GetX1(); x1 <= list[i]->GetX2() && t == false; ++x1)
            for (y2 = list[i]->GetY1(); y2 <= list[i]->GetY2() && t == false; ++y2)
                for (x2 = list[i]->GetX1(); x2 <= list[i]->GetX2() && t == false; ++x2)
                {
                    if (abs(Bitmap->GetPixel(x1, y1).B - Bitmap->GetPixel(x2, y2).B) > dif)
                                       {
                                          list->Add(gcnew Cell(-1, 0, 0, 0, 0));
                      list->Add(gcnew Cell(-1, 0, 0, 0, 0));
                                          t=true;
if ((y1 != y2))
                        {
 
                            list[n + 1]->CellInit(n, list[i]->GetX1(), list[i]->GetY1(), list[i]->GetX2(), y2 - 1);
                            list[n + 2]->CellInit(n, list[i]->GetX1(), y2, list[i]->GetX2(), list[i]->GetY2());
                            for (int k = list[i]->GetX1(); k <= list[i]->GetX2() && (y2 - 1) >= 0; k++)
                            {
                                Bitmap->SetPixel(k, y2 - 1, Color::FromArgb(255, 0, 0, 0));
                            }
                        }
                        else if ((x1 != x2) && (y1 == y2))
                        {
 
                            list[n + 1]->CellInit(n, list[i]->GetX1(), list[i]->GetY1(), x2 - 1, list[i]->GetY2());
                            list[n + 2]->CellInit(n, x2, y2, list[i]->GetX2(), list[i]->GetY2());
 
                            for (int k = list[i]->GetY1(); k <= list[i]->GetY2(); k++)
                            {
 
                                Bitmap->SetPixel(x2 - 1, k, Color::FromArgb(255, 0, 0, 0));
                            }
                        }
 
                                        }
                         if (t==false)
                    {// что-то делаю с i-ым элементом листа }
}
VTsaregorodtsev
297 / 277 / 35
Регистрация: 19.02.2010
Сообщений: 1,210
15.11.2015, 21:28     Разбить изображение по яркости #4
Цитата Сообщение от belka32 Посмотреть сообщение
Но этот алгоритм долго работает. Как можно изменить его?
Долго - потому, что работаете через гет-функции. Имеются в виду не те, которые Вы написали, а ГетПиксел и обращение к элементу списка. Ну и СетПиксел туда же, т.е. в морг.
Yandex
Объявления
15.11.2015, 21:28     Разбить изображение по яркости
Ответ Создать тему
Опции темы

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