|
#1
|
|||
|
|||
Фильтр цветов
Добрый день. я в программировании новичек, никак не могу разобраться с проблемой: нужно удалить все цвета с голубоватым оттенком с BMP картинки.
Слева исходный файл, справа желаемый результат. Но как сделать это програмно не знаю. http://s8.hostingkartinok.com/upload...6ea3db8e97.jpg |
#2
|
||||
|
||||
Разложить цвет на составляющие GetRValue(), GetGValue(), GetBValue() и по уровню G и B относительно R вычислить голубой оттенок.
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
stlcrash (01.06.2016)
|
#3
|
|||
|
|||
Код:
function Same(t1,t2:TRGBTriple):Boolean; begin result := (t1.r=t2.r) and (t1.g=t2.g) and (t1.b=t2.b); end; //Img1-img2 procedure TForm1.FindDiff; var x,y:integer; p1,p2:TRGBTriple; a1,a2,a3:PRGBTripleArray; res:TBitmap; const w:TRGBTriple=(b:255;g:255;r:255); begin res:=TBitmap.Create; res.PixelFormat := pf24bit; res.Width := bmp1.Width; res.height:=bmp1.height; for y:=0 to bmp1.Height-1 do begin a1:=PRGBTripleArray(bmp1.ScanLine[y]); a2:=PRGBTripleArray(bmp2.ScanLine[y]); a3:=PRGBTripleArray(res.ScanLine[y]); for x := 0 to bmp1.width-1 do begin p1:=a1[x]; p2:=a2[x]; if not same(p1,p2) then a3[x]:=p2 else a3[x]:=w; end; end; img1.width:=res.Width; img1.Height:=res.Height; img1.Picture.Assign(res); Detect(res,((HeightWidth.Value*HeightWidth.Value) div 100)*BWPorog.Position); res.Free; end; a3[x]:=p2 Как на строке проверить входит ли p2 в указанный диапазон? rMin rMax gMin gMax bMin bMax |
#4
|
|||
|
|||
Работает, но появилась проблемка. Если
filterVoter.Checked filtersilver.Checked False То работает как и раньше. Но стоит только изменить один из фильтров на True, начинает думать по 10 секунд... Код:
//сравнение 2 пикселей полученных с помощью ScanLine function Same(t1,t2:TRGBTriple):Boolean; begin result := (t1.r=t2.r) and (t1.g=t2.g) and (t1.b=t2.b); end; function IsColorDiff_InRange(t1: TRGBTriple; rMin, rMax, gMin, gMax, bMin, bMax: Byte): Boolean; begin result:= (t1.r In [rMin..rMax]) and (t1.g In [gMin..gMax]) and (t1.b In [bMin..bMax]); end; //Img1-img2 procedure TForm1.FindDiff; var x,y:integer; p1,p2:TRGBTriple; a1,a2,a3:PRGBTripleArray; res:TBitmap; paintOver:boolean; const w:TRGBTriple=(b:255;g:255;r:255); begin res:=TBitmap.Create; res.PixelFormat := pf24bit; res.Width := bmp1.Width; res.height:=bmp1.height; for y:=0 to bmp1.Height-1 do begin a1:=PRGBTripleArray(bmp1.ScanLine[y]); a2:=PRGBTripleArray(bmp2.ScanLine[y]); a3:=PRGBTripleArray(res.ScanLine[y]); for x := 0 to bmp1.width-1 do begin p1:=a1[x]; p2:=a2[x]; if not same(p1,p2) then begin paintOver:=true; if filterVoter.Checked then if IsColorDiff_InRange(p2, Filter1Rmin.Value, Filter1Rmax.Value, Filter1Gmin.Value, Filter1Gmax.Value, Filter1Bmin.Value, Filter1Bmax.Value) then paintOver:=false; if (filtersilver.Checked) and (paintOver) then if IsColorDiff_InRange(p2, Filter2Rmin.Value, Filter2Rmax.Value, Filter2Gmin.Value, Filter2Gmax.Value, Filter2Bmin.Value, Filter2Bmax.Value) then paintOver:=false; if paintOver then a3[x]:=p2 else a3[x]:=w; end else a3[x]:=w;//закрашиваем пиксель в белый цвет end; end; img1.width:=res.Width; img1.Height:=res.Height; img1.Picture.Assign(res); Detect(res,((HeightWidth.Value*HeightWidth.Value) div 100)*BWPorog.Position); res.Free; end; |
#5
|
||||
|
||||
Если можешь - скинь свою прогу, гляну что там у тебя так тормозит.
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#6
|
|||
|
|||
все уже ок. удалил глобальные переменные, точней заменил их на локальные в процедуре и все стало работать как нужно.
Код:
procedure TForm1.FindDiff; var x,y:integer; p1,p2:TRGBTriple; a1,a2,a3:PRGBTripleArray; res:TBitmap; paintOver,f1,f2:boolean; r1min,r1max,g1min,g1max,b1min,b1max:integer; r2min,r2max,g2min,g2max,b2min,b2max:integer; const w:TRGBTriple=(b:255;g:255;r:255); begin f1:=filterVoter.Checked; f2:=filtersilver.Checked; r1min:=Filter1Rmin.Value; r1max:=Filter1Rmax.Value; g1min:=Filter1Gmin.Value; g1max:=Filter1Gmax.Value; b1min:=Filter1Bmin.Value; b1max:=Filter1Bmax.Value; r2min:=Filter2Rmin.Value; r2max:=Filter2Rmax.Value; g2min:=Filter2Gmin.Value; g2max:=Filter2Gmax.Value; b2min:=Filter2Bmin.Value; b2max:=Filter2Bmax.Value; res:=TBitmap.Create; res.PixelFormat := pf24bit; res.Width := bmp1.Width; res.height:=bmp1.height; for y:=0 to bmp1.Height-1 do begin a1:=PRGBTripleArray(bmp1.ScanLine[y]); a2:=PRGBTripleArray(bmp2.ScanLine[y]); a3:=PRGBTripleArray(res.ScanLine[y]); for x := 0 to bmp1.width-1 do begin p1:=a1[x]; p2:=a2[x]; if not same(p1,p2) then begin paintOver:=true; if f1 then if IsColorDiff_InRange(p2,r1min,r1max,g1min,g1max,b1min,b1max) then paintOver:=false; if (f2) and (paintOver) then if IsColorDiff_InRange(p2, r2min,r2max,g2min,g2max,b2min,b2max) then paintOver:=false; if paintOver then a3[x]:=p2 else a3[x]:=w; end else a3[x]:=w;//закрашиваем пиксель в белый цвет end; end; img1.width:=res.Width; img1.Height:=res.Height; img1.Picture.Assign(res); Detect(res,((HeightWidth.Value*HeightWidth.Value) div 100)*BWPorog.Position); res.Free; end; |