Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2021, 05:51   #1
noveek
Пользователь
 
Регистрация: 26.05.2015
Сообщений: 56
По умолчанию Как убрать шум/помехи с изображения

Здрасте, как убрать шум или помехи с изображения (Tbitmap)

Из такого:

Получить такое:
Изображения
Тип файла: bmp 112a.bmp (26.4 Кб, 53 просмотров)
Тип файла: bmp 113a.bmp (9.4 Кб, 52 просмотров)
noveek вне форума Ответить с цитированием
Старый 16.12.2021, 06:14   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

noveek
Сразу распознать буквы и все дела. А потом нарисовать распознанные.

Обычно для удаления точек Применяют медиальный фильтр.
https://programmersforum.ru/showthread.php?t=341337

Для царапин можно применить алгоритм Хаффа. Классифицируем все линии по длине потом. Те которые больше порога. Те закрашиваете цветом фона.

Потом применяете оператор мат.морфологии "Закрытие" для восстановление пропусков в буквах.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 16.12.2021, 06:49   #3
noveek
Пользователь
 
Регистрация: 26.05.2015
Сообщений: 56
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
noveek
Сразу распознать буквы и все дела. А потом нарисовать распознанные.

Обычно для удаления точек Применяют медиальный фильтр.
https://programmersforum.ru/showthread.php?t=341337

Для царапин можно применить алгоритм Хаффа. Классифицируем все линии по длине потом. Те которые больше порога. Те закрашиваете цветом фона.

Потом применяете оператор мат.морфологии "Закрытие" для восстановление пропусков в буквах.
Как не странно тот "мой" медианный фильтр не удаляет точки
Процедура Хаффа не сделала ровным счётом ничего и работает очень долго 5 минут на обработку по сути даже ещё хуже чем было)
Код:
procedure Haff(bmp:Tbitmap);
var
RMax, m_width, m_height, MaxPhaseValue, Xbegin, Ybegin, Xend, Yend: integer;
Teta,R: Double;
PhaseSpace: array of array of integer;
ArPoint: array of Tpoint;
i, j, m, n: integer;
begin
m_width:=bmp.Width;
m_height:=bmp.Height;
RMax := round(sqrt(m_width * m_width + m_height * m_height));
SetLength(PhaseSpace, 180);
for I := Low(PhaseSpace) to High(PhaseSpace) do
SetLength(PhaseSpace[I], RMax);
for i := 0 to 179 do
for j := 0 to RMax-1 do
PhaseSpace[i,j] := 0;
for m := 0 to bmp.Width-1 do
for n := 0 to bmp.Height-1 do
if (bmp.Canvas.Pixels[m+1,n+1] >0 ) then
for i := 0 to 179 do
for j := 0 to RMax-1 do begin
Teta:=i/180*Pi;
if ( abs(((m+1) * sin(Teta) + (n+1) * cos(Teta)) - j)<0.1 ) then
inc(PhaseSpace[i,j]);
end;
MaxPhaseValue := 0;
for i := 0 to 179 do
for j := 0 to RMax-1 do begin
bmp.Canvas.Pixels[m+1,n+1]:=PhaseSpace[i,j]*8;
if (PhaseSpace[i,j] > MaxPhaseValue) then begin
MaxPhaseValue := PhaseSpace[i,j];
Teta:=i;
R:=j;
end;
end;
Teta:=Teta/180*Pi;
for m := 0 to bmp.Width-1 do
for n := 0 to bmp.Height-1 do
if ( round(((m+1) * sin(Teta) + (n+1) * cos(Teta))) = R) then
bmp.Canvas.Pixels[m+1,n+1]:=clBlue;
end;
Изображения
Тип файла: bmp 5432.bmp (26.4 Кб, 48 просмотров)

Последний раз редактировалось noveek; 16.12.2021 в 07:04.
noveek вне форума Ответить с цитированием
Старый 17.12.2021, 04:55   #4
noveek
Пользователь
 
Регистрация: 26.05.2015
Сообщений: 56
По умолчанию

Никто не знает ?
noveek вне форума Ответить с цитированием
Старый 17.12.2021, 05:44   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Ну самая длинная линия выделяется синим:
Код:
procedure Haff(bmp: Tbitmap);
const
  lines = 180;
var
  RMax, m_width, m_height, MaxPhaseValue: integer;
  Teta, R: Double;
  PhaseSpace: array of array of integer;
  i, j, m, n: integer;
begin
  m_width := bmp.Width;
  m_height := bmp.Height;
  RMax := round(sqrt(m_width * m_width + m_height * m_height));

  SetLength(PhaseSpace, lines, RMax);

  for i := 0 to lines - 1 do
    for j := 0 to RMax - 1 do
      PhaseSpace[i, j] := 0;

  for m := 0 to m_width - 1 do
    for n := 0 to m_height - 1 do
      if bmp.Canvas.Pixels[m, n] = clBlack then
        for i := 0 to lines - 1 do
        begin
          Teta := i / lines * Pi;
          R := m * cos(Teta) + n * sin(Teta);
          inc(PhaseSpace[i, Round(R)]);
        end;
        
  MaxPhaseValue := 0;
  for i := 0 to lines - 1 do
    for j := 0 to RMax - 1 do
    begin
      if PhaseSpace[i, j] > MaxPhaseValue then begin
        MaxPhaseValue := PhaseSpace[i, j];
        Teta := i;
        R := j;
      end;
    end;

  Teta := Teta / lines * Pi;
  for m := 0 to m_width - 1 do
    for n := 0 to m_height - 1 do
      if round(m * cos(Teta) + n * sin(Teta)) = R then
        bmp.Canvas.Pixels[m, n] := clBlue;

  SetLength(PhaseSpace, 0, 0);
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.12.2021, 05:48   #6
noveek
Пользователь
 
Регистрация: 26.05.2015
Сообщений: 56
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Ну самая длинная линия выделяется синим:
Код:
procedure Haff(bmp: Tbitmap);
const
  lines = 180;
var
  RMax, m_width, m_height, MaxPhaseValue: integer;
  Teta, R: Double;
  PhaseSpace: array of array of integer;
  i, j, m, n: integer;
begin
  m_width := bmp.Width;
  m_height := bmp.Height;
  RMax := round(sqrt(m_width * m_width + m_height * m_height));

  SetLength(PhaseSpace, lines, RMax);

  for i := 0 to lines - 1 do
    for j := 0 to RMax - 1 do
      PhaseSpace[i, j] := 0;

  for m := 0 to m_width - 1 do
    for n := 0 to m_height - 1 do
      if bmp.Canvas.Pixels[m, n] = clBlack then
        for i := 0 to lines - 1 do
        begin
          Teta := i / lines * Pi;
          R := m * cos(Teta) + n * sin(Teta);
          inc(PhaseSpace[i, Round(R)]);
        end;
        
  MaxPhaseValue := 0;
  for i := 0 to lines - 1 do
    for j := 0 to RMax - 1 do
    begin
      if PhaseSpace[i, j] > MaxPhaseValue then begin
        MaxPhaseValue := PhaseSpace[i, j];
        Teta := i;
        R := j;
      end;
    end;

  Teta := Teta / lines * Pi;
  for m := 0 to m_width - 1 do
    for n := 0 to m_height - 1 do
      if round(m * cos(Teta) + n * sin(Teta)) = R then
        bmp.Canvas.Pixels[m, n] := clBlue;

  SetLength(PhaseSpace, 0, 0);
end;
Ну щас выделяется одна линия мне только все линии и точки надо удалить же, толку от этой процедуры она не то делает

Последний раз редактировалось noveek; 17.12.2021 в 05:51.
noveek вне форума Ответить с цитированием
Старый 17.12.2021, 18:15   #7
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

я бы для начала нашёл средний размер чёрных точек и удалял бы их - чёрные участки на сером квадрате, которые имеют размер, скажем, 10x10 пикс.
потом нашёл бы максимальный по длине и ширине размер букв и цифр и уже выискивал бы их и копировал. а остальные участки - где линия - те не прорисовывал бы банально.
----------
задача интересная, но надо много таких картинок где-то сгенерировать и уже на них отрабатывать алгоритм поиска символов
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 17.12.2021, 18:22   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от noveek Посмотреть сообщение
толку от этой процедуры
Ну так это же ваш проект, вот и дорабатывайте, как хотите. Сами же привели этот код, который чертил одну линию не пойми где. Вот теперь чертится линия где надо. Выберите порог для значения из PhaseSpace и закрашивайте все линии, у которых значение больше порога.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.12.2021, 21:11   #9
noveek
Пользователь
 
Регистрация: 26.05.2015
Сообщений: 56
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Ну так это же ваш проект, вот и дорабатывайте, как хотите. Сами же привели этот код, который чертил одну линию не пойми где. Вот теперь чертится линия где надо. Выберите порог для значения из PhaseSpace и закрашивайте все линии, у которых значение больше порога.
Так мне Pavia сказал что нужен Хафф вот Хафф
noveek вне форума Ответить с цитированием
Старый 18.12.2021, 05:22   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от noveek Посмотреть сообщение
Pavia сказал что нужен Хафф вот Хафф
Цитата:
Сообщение от Pavia Посмотреть сообщение
применить алгоритм Хаффа. Классифицируем все линии по длине потом. Те которые больше порога. Те закрашиваете цветом фона.
Так тут после Хаффа еще указаны шаги
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как убрать шум из звуковой дорожки? ScribaXXI Общие вопросы по Java, Java SE, Kotlin 0 24.06.2015 09:24
Помогите убрать шум и background из волни wav файла. sarvar4ik PHP 4 26.01.2014 13:56
Убрать фоновый шум TUberwer Мультимедиа в Delphi 1 23.08.2013 22:44
Как убрать шум с изображения egorka2134 Общие вопросы Delphi 10 16.08.2013 16:30