Чистка изображения от шумов на Delphi

28 декабря 2015, понедельник | просмотров: 2489

Здравствуйте! Время от времени ко мне поступают просьбы почистить изображение от шумов. Чаще всего такие изображения получаются после сканирования. Так как фон сканера не всегда идеально чист, то часто в конечном результате можно наблюдать посторонние помехи в виде какого-нибудь синего или серого фона, а так же посторонние точки. Это недопустимо в тех случаях, если организация обменивается какими-то нормативными документами, где есть синяя печать или подпись человека, так как при печати теряется четкость документа.

Вот так выглядят исходные изображения, которые нужно почистить от шумов:



Чистка изображения от шумов на Delphi



При увеличении можно заметить те самые помехи.



Чистка изображения от шумов на Delphi



Специально для такой обработки я написал программу на Delphi, которая удаляет помехи из изображения. Алгоритм работы следующий:
1. Берется темный цвет.
2. Далее сканируются все пиксели изображения.
3. Цвета, которые темнее заданного цвета заменяются на прозрачный цвет.
4. Граница цвета изменяется к более светлым оттенкам и все повторяется заново.

Граница цвета регулируется специальным ползунком.

В режиме конструктора программа имеет такой вид:



Чистка изображения от шумов на Delphi



Исходный код .dfm-фала:


object MainForm: TMainForm
Left = 193
Top = 109
AutoScroll = False
Caption = #1063#1080#1089#1090#1082#1072' '#1096#1091#1084#1086#1074
ClientHeight = 312
ClientWidth = 658
Color = 14680063
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
PixelsPerInch = 96
TextHeight = 13
object Shape1: TShape
Left = 33
Top = 33
Width = 625
Height = 260
Align = alClient
Brush.Color = clBlack
Pen.Color = clWhite
end
object Image1: TImage
Left = 33
Top = 33
Width = 625
Height = 260
Align = alClient
Proportional = True
Stretch = True
Transparent = True
end
object StatusBar1: TStatusBar
Left = 0
Top = 293
Width = 658
Height = 19
AutoHint = True
Panels = <
item
Width = 300
end
item
Width = 50
end>
end
object ToolBar1: TToolBar
Left = 0
Top = 0
Width = 658
Height = 33
ButtonHeight = 21
ButtonWidth = 105
Caption = 'ToolBar1'
ShowCaptions = True
TabOrder = 1
Transparent = True
Wrapable = False
object ToolButton1: TToolButton
Left = 0
Top = 2
Hint = #1054#1090#1082#1088#1099#1090#1100' '#1080#1079#1086#1073#1088#1072#1078#1077#1085#1080#1077'.'
AutoSize = True
Caption = '1 - '#1054#1090#1082#1088#1099#1090#1100
ImageIndex = 0
OnClick = ToolButton1Click
end
object ToolButton2: TToolButton
Left = 70
Top = 2
Hint = #1054#1095#1080#1089#1090#1080#1090#1100' '#1086#1090' '#1096#1091#1084#1086#1074'.'
AutoSize = True
Caption = '2 - '#1055#1086#1095#1080#1089#1090#1080#1090#1100
ImageIndex = 1
OnClick = ToolButton2Click
end
object ToolButton3: TToolButton
Left = 149
Top = 2
Hint = #1057#1086#1093#1088#1072#1085#1080#1090#1100' '#1080#1079#1086#1073#1088#1072#1078#1077#1085#1080#1077' '#1082#1072#1082'.'
AutoSize = True
Caption = '3 - '#1057#1086#1093#1088#1072#1085#1080#1090#1100' '#1082#1072#1082'...'
ImageIndex = 2
OnClick = ToolButton3Click
end
object ToolButton4: TToolButton
Left = 258
Top = 2
Width = 6
Caption = 'ToolButton4'
ImageIndex = 3
Style = tbsSeparator
end
object ToolButton5: TToolButton
Left = 264
Top = 2
Hint = #1055#1088#1086#1079#1088#1072#1095#1085#1086#1089#1090#1100'.'
AutoSize = True
Caption = #1055#1088#1086#1079#1088#1072#1095#1085#1086#1089#1090#1100
Down = True
ImageIndex = 3
Style = tbsCheck
OnClick = ToolButton5Click
end
object ToolButton6: TToolButton
Left = 347
Top = 2
Width = 7
Caption = 'ToolButton6'
ImageIndex = 4
Style = tbsSeparator
end
end
object TrackBar1: TTrackBar
Left = 0
Top = 33
Width = 33
Height = 260
Hint = #1059#1088#1086#1074#1077#1085#1100' '#1086#1095#1080#1089#1090#1082#1080' '#1096#1091#1084#1086#1074' ('#1085#1080#1078#1085#1103#1103' '#1075#1088#1072#1085#1080#1094#1072')'
Align = alLeft
Max = 255
Orientation = trVertical
Position = 255
TabOrder = 2
ThumbLength = 18
TickMarks = tmTopLeft
OnChange = ToolButton2Click
end
object OpenDialog1: TOpenDialog
Filter = #1048#1079#1086#1073#1088#1072#1078#1077#1085#1080#1103'|*.bmp'
Title = #1042#1099#1073#1086#1088' '#1080#1079#1086#1073#1088#1072#1078#1077#1085#1080#1103
Left = 72
Top = 40
end
object SaveDialog1: TSaveDialog
DefaultExt = '*.bmp'
Filter = 'BMP-'#1080#1079#1086#1073#1088#1072#1078#1077#1085#1080#1103'|*.bmp'
Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing]
Title = #1057#1086#1093#1088#1072#1085#1077#1085#1080#1077' '#1080#1079#1086#1073#1088#1072#1078#1077#1085#1080#1103
Left = 104
Top = 40
end
end



Исходный код .dpr-файла:

program Clea;
uses
Forms,
XPMan,
Main in 'Main.pas' {MainForm};
begin
Application.Title:='Чистка шумов';
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.


Исходный код .pas-файла:

unit Main; {$R *.dfm}
interface
uses
Windows, SysUtils, Graphics, Controls, Forms, Dialogs, ComCtrls, ToolWin,
ExtCtrls, Classes;
type
TMainForm = class(TForm)
OpenDialog1: TOpenDialog;
StatusBar1: TStatusBar;
SaveDialog1: TSaveDialog;
Shape1: TShape;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
Image1: TImage;
TrackBar1: TTrackBar;
procedure ToolButton1Click(Sender: TObject);
procedure ToolButton2Click(Sender: TObject);
procedure ToolButton3Click(Sender: TObject);
procedure ToolButton5Click(Sender: TObject);
end;
var
MainForm: TMainForm;
S: String = ''; {Имя изображения}
implementation
procedure TMainForm.ToolButton1Click(Sender: TObject);
begin {Открыть}
if OpenDialog1.Execute then begin
S:=OpenDialog1.FileName;
Image1.Picture.Bitmap.LoadFromFile(S);
StatusBar1.Panels[01].Text:=ExtractFileName(S) + ' [' + IntToStr(Image1.Picture.Width) + ' x ' + IntToStr(Image1.Picture.Height) + ']';
end;
end;
procedure TMainForm.ToolButton2Click(Sender: TObject);
var
X, Y: Word;
B: TBitmap;
R: pByteArray;
begin {Очистка от шума}
if Image1.Picture.Bitmap.Handle <= 00 then Exit;
B:=TBitmap.Create;
B.LoadFromFile(S);
for Y:=00 to B.Height - 01 do begin
R:=pByteArray(B.Scanline[Y]);
for X:=00 to (B.Width * 3) - 01 do
if R[X] > TrackBar1.Position then R[X]:=$FF; {Заменяем белым цветом!}
end;
Image1.Picture.Graphic:=B;
B.Free;
end;
procedure TMainForm.ToolButton3Click(Sender: TObject);
begin {Сохранить как}
if Image1.Picture.Bitmap.Handle <= 00 then Exit;
if SaveDialog1.Execute then Image1.Picture.Bitmap.SaveToFile(SaveDialog1.FileName);
end;
procedure TMainForm.ToolButton5Click(Sender: TObject);
begin {Прозрачность}
Image1.Transparent:=ToolButton5.Down;
end;
end.


Программа имеет всего одну форму. На главной форме четыре кнопки:
1. Открыть. Открывает исходное изображение. Входной файл должен быть BMP-формата!
2. Почистить. Чистит шум по выбранной границе. Происходит автоматически по изменению положения ползунка.
3. Сохранить как.... Сохраняет открытое изображение с изменениями в BMP-формате.
4. Прозрачность. Включает или отключает режим прозрачности. Прозрачным считается белые цвет. При включенном режиме белый цвет становится черным, и все остальное - это отличные от белого цвета пиксели! В том числе и помехи.

Так выглядит программа с загруженным исходным изображением с выключенным режимом прозрачности.



Чистка изображения от шумов на Delphi



Ниже показан режим прозрачности в работе:



Чистка изображения от шумов на Delphi



Можно отчетливо разглядеть все ненужные помехи.

Двигая ползунок вверх, помехи начинают исчезать.



Чистка изображения от шумов на Delphi




Чистка изображения от шумов на Delphi



После того как помехи удалены выключаем режим прозрачности и видим совершенно чистую картинку.



Чистка изображения от шумов на Delphi



Такую картинку можно накладывать, например, на текст со включенным режимом прозрачности. Например в MS Word для этого есть функция "Установить прозрачный цвет".



Чистка изображения от шумов на Delphi




Чистка изображения от шумов на Delphi




Чистка изображения от шумов на Delphi



В программу можно загружать и документы большего размера. Он готов чистить страницы целиком с большой скоростью!




Скачать


Понравилась публикация? Поддержи сайт, поделись записью внизу страницы !


Комментариев нет.




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

Поделиться страницей в социальных сетях



Поделиться ВКонтакте Поделиться Facebook Поделиться Одноклассники Поделиться Twitter Поделиться Google+

Личный кабинет




Регистрация

Знаете ли вы...


На самом деле сердце расположено ни слева, ни справа, оно помещается за грудной клеткой посредине туловища, между левым и правым легкими


Просмотр изображения