Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Анализ графической информации на чертеже, надо сделать 
:(
    Опции темы
Racer
Дата 11.11.2010, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



Добрый вечер, товарищи.

Занялся написанием программы, которая анализирует кол-во графической информации на чертеже. Для друга делаю.

Суть: есть условный сканер, который "идет "по чертежу и ищет "пересечения". То есть если цвет пикселя черный, то это пересечение. Но на чертеж  могут быть "шумы" - когда его сканировали на хреновом сканере. Их надо отфильтровывать. Я делаю так: циклами иду по битмапу и смотрю пиксели. Когда нашел точку пересечения, смотрю вокруг- если хоть в 1 из 8 пикселей есть тоже черный пиксель- то это мы попали на линии и ее нужно засчитать. (см. картинку) Если вокруг нет- то это считается одиночной точкой, то есть шумом.

Схема: Схема

Проблема: не все линии вылавливает. А это критично. По теории, если линия идет допустим под неким углом, то она будет красить пиксели, лежащие вкруг(хотя бы один) На схеме: мы нашли пересечение в центральном пикселе. затем смотрим вокруг- начиная слева сверху. на схеме мы найдем пересечение еще и вверху над найденным 1 пикселем. и должны засчитать это линией. Но на практике почему не всегда так. Пропускает линии.

Помогите пожалуйста. Если можете, укажите на ошибки в моем алгоритме или предложите свой. Необходимо забирать все линии (макс недобор - 0,5%)и фильтровать шумы(макс взятых шумов от всех - 0,5%). 

Пример чертежа
PM MAIL   Вверх
VictorTsaregorodtsev
Дата 11.11.2010, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 28.7.2006

Репутация: 3
Всего: 8



Гуглите алгоритмы векторизации.
Хотя, вообще-то, чертежного софта с такими возможностями должно быть много. В России начало бума перевода старых бумажных чертежей в цифру пришлось на середину 90х - т.е. и промышленного, и самописного софта должен быть вагон и маленькая тележка
PM MAIL WWW   Вверх
Racer
Дата 11.11.2010, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



Ну вагон или нет, меня знаете ли не интересует.

Спасибо погуглю, а замечаний по моему алгоритму нет?
PM MAIL   Вверх
Earnest
Дата 12.11.2010, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Цитата(Racer @  11.11.2010,  20:56 Найти цитируемый пост)
 Но на практике почему не всегда так. Пропускает линии.

99% ошибка реализации. Если, конечно, в линиях нет дырок. Если есть, сначала отфильтруй (залей дырки простейшим фильтром по соседям). 
Кстати, единичный шум можно убрать точно также (только наоборот - если у черного пиксела нет соседей, или мало - меньше заданного числа - убрать). А потом можно просто посчитать оставшиеся пикселы.
И еще. У тебя, что линии толщиной в один пиксел? 


--------------------
...
PM   Вверх
_Y_
Дата 12.11.2010, 10:26 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



В природе существует такая книжка  Визильтер, Желтов, Князь: Обработка и анализ цифровых изображений с примерами на LabVIEW и IMAQ Vision. Сам язык LabVIEW врядли заинтересует, но в книжке каждая тема состоит из двух частей: сначала хорошее описание принципов, а только потом реализация на LabVIEW. Вот эти-то пронципы и помогут решить проблему.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Racer
Дата 13.11.2010, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



Линии не обязательно толщиной в 1 пиксель.

мой код:
Код

  for y := 1 to Round((hei-1) / step) do
    for x := 1 to Round((wid-1) / step) do
    begin
      xx:= x*step;
      yy:= y*step;

      if (xx) >=wid then Continue;
      if (yy) >= hei then Continue;

      microCount:= 0;
      for k := 0 to step-1 do
      begin
        xk:= xx + k;
        yk:= yy;
        Application.ProcessMessages;
        Bar.Position:= Bar.Position + 1;
        red:=   R(GetPixel(BM.Canvas.Handle, xk, yk));
        green:= G(GetPixel(BM.Canvas.Handle, xk, yk));
        blue:=  B(GetPixel(BM.Canvas.Handle, xk, yk));

        // если нет ничего - след. проход :
        if (red<>0) or (green<>0) or (blue<>0) then
          Continue;

        // слева вверху :
        red:=   R(GetPixel(BM.Canvas.Handle, xk-Fk, yk-Fk));
        green:= G(GetPixel(BM.Canvas.Handle, xk-Fk, yk-Fk));
        blue:=  B(GetPixel(BM.Canvas.Handle, xk-Fk, yk-Fk));
        if (red<>255) and (green<>255) and (blue<>255) then
        begin
          Inc(microCount);
          if microCount = 1 then
            lk:= k;
          Continue;
        end;



        // слева :
        red:=   R(GetPixel(BM.Canvas.Handle, xk-Fk, yk));
        green:= G(GetPixel(BM.Canvas.Handle, xk-Fk, yk));
        blue:=  B(GetPixel(BM.Canvas.Handle, xk-Fk, yk));
        if (red<>255) and (green<>255) and (blue<>255) then
        begin
          Inc(microCount);
          if microCount = 1 then
            lk:= k;
          Continue;
        end;

        // справа :
        red:=   R(GetPixel(BM.Canvas.Handle, xk+Fk, yk));
        green:= G(GetPixel(BM.Canvas.Handle, xk+Fk, yk));
        blue:=  B(GetPixel(BM.Canvas.Handle, xk+Fk, yk));
        if (red<>255) and (green<>255) and (blue<>255) then
        begin
          Inc(microCount);
          if microCount = 1 then
            lk:= k;
          Continue;
        end;



        // вверху :
        red:=   R(GetPixel(BM.Canvas.Handle, xk, yk-Fk));
        green:= G(GetPixel(BM.Canvas.Handle, xk, yk-Fk));
        blue:=  B(GetPixel(BM.Canvas.Handle, xk, yk-Fk));
        if (red<>255) and (green<>255) and (blue<>255) then
        begin
          Inc(microCount);
          if microCount = 1 then
            lk:= k;
          Continue;
        end;

        // справа вверху :
        red:=   R(GetPixel(BM.Canvas.Handle, xk+Fk, yk-Fk));
        green:= G(GetPixel(BM.Canvas.Handle, xk+Fk, yk-Fk));
        blue:=  B(GetPixel(BM.Canvas.Handle, xk+Fk, yk-Fk));
        if (red<>255) and (green<>255) and (blue<>255) then
        begin
          Inc(microCount);
          if microCount = 1 then
            lk:= k;
          Continue;
        end;

        // слева внизу :
        red:=   R(GetPixel(BM.Canvas.Handle, xk-Fk, yk+Fk));
        green:= G(GetPixel(BM.Canvas.Handle, xk-Fk, yk+Fk));
        blue:=  B(GetPixel(BM.Canvas.Handle, xk-Fk, yk+Fk));
        if (red<>255) and (green<>255) and (blue<>255) then
        begin
          Inc(microCount);
          if microCount = 1 then
            lk:= k;
          Continue;
        end;

        // снизу :
        red:=   R(GetPixel(BM.Canvas.Handle, xk, yk+Fk));
        green:= G(GetPixel(BM.Canvas.Handle, xk, yk+Fk));
        blue:=  B(GetPixel(BM.Canvas.Handle, xk, yk+Fk));
        if (red<>255) and (green<>255) and (blue<>255) then
        begin
          Inc(microCount);
          if microCount = 1 then
            lk:= k;
          Continue;
        end;

        // справа снизу :
        red:=   R(GetPixel(BM.Canvas.Handle, xk+Fk, yk+Fk));
        green:= G(GetPixel(BM.Canvas.Handle, xk+Fk, yk+Fk));
        blue:=  B(GetPixel(BM.Canvas.Handle, xk+Fk, yk+Fk));
        if (red<>255) and (green<>255) and (blue<>255) then
        begin
          Inc(microCount);
          if microCount = 1 then
            lk:= k;
          Continue;
        end;
      end;

      // если есть попадания - граф инфа :
      if (microCount < step) and (microCount <> 0) then begin
        Inc(Count);
        if NeedDraw then
        Image1.Canvas.Ellipse(lk+xx-10, lk+yy-10,
          lk+xx+10, lk+yy+10);
      end;
    end;


Может где и ошибся, только не могу найти smile

PM MAIL   Вверх
Racer
Дата 14.11.2010, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



Никто мне не поможет?
Очень надо, плиз!
PM MAIL   Вверх
Pavia
Дата 14.11.2010, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



  microCount:= 0;
      for k := 0 to step-1 do
      begin
        xk:= xx + k;
        yk:= yy; - тоже менять надо надо .
PM MAIL   Вверх
Racer
Дата 15.11.2010, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



Оно меняется. просто есть аналогичная вторая часть, в которой меняются таким образом y а х остается как здесь у.
Как бы сначала горизонтальный проход, а затем вертикальный.
PM MAIL   Вверх
setnull
Дата 26.1.2012, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 3.7.2007

Репутация: нет
Всего: 1



Цитата(Racer @ 13.11.2010,  00:48)
мой код:
Код

      xx:= x*step;
        xk:= xx + k;
    end;


Сильно не вникал, но показалось, что анализируются соседи только для одного из 4ех секторов?

Код

      xx:= (x+0.5)*step;
        xk:= xx + k - step div 2;


это если именно по Вашему алгоритму.
А вообще, действительно лучше просто пропустить изображение через какой подходящий к требованиям задачи фильтр



Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  maximum.jpg 20,66 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1203 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.