Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

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


Шустрый
*


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

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



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

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

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

Схема: Схема

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

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

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


Опытный
**


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

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



пиксель сразу удаляется, или сначала идет проход по всему чертежу и только потом удаляются найденные?
PM MAIL   Вверх
Racer
Дата 11.11.2010, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Они не удаляются вообще, просто если нашли ЛИНИЮ, то к общему кол-ву найденного добавили +1
PM MAIL   Вверх
aleksh
Дата 12.11.2010, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а покажи код где ты определяешь есть ли что-то вокруг обнаруженного пикселя
PM MAIL   Вверх
Racer
Дата 13.11.2010, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



мой код:
Код

  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;

PM MAIL   Вверх
CROTishka
Дата 13.11.2010, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



давай уж целиком весь код и файл графический тестовый. 
и не пиши код такими простынями. :(

Это сообщение отредактировал(а) CROTishka - 13.11.2010, 12:38
PM MAIL   Вверх
Racer
Дата 13.11.2010, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Это и так почти весь код. за кадром только загрузка изображения и интерфейс, которые не нужны в условиях обсуждения данной проблемы.

Пример чертежа


Что значит простынями?

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


Шустрый
*


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

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



Помогите мне плиз. Очень надо
PM MAIL   Вверх
CROTishka
Дата 15.11.2010, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



пока по этому коду, который ты предоставил, я могу судить только то, что часть "шумов" он будет пропускать.
Код

Проблема: не все линии вылавливает.
опиши подробнее
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


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

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


 




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


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

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