Форум: "Начинающим";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];
Внизсглаживание, выделение границ и т.д и т.п. Найти похожие ветки
← →
анонимус (2011-08-23 06:04) [0]Вообщем пытаюсь как нибудь изувечить изображение, чтобы при его последующей (ну или одновременной) бинаризации "пропадало" как можно меньше "нужных" пикселей. отчего пытаюсь делать всяческие фильтры. Но читая то как они "работают". и смотря на то что получается у меня ко мне вкрадываются некоторые сомнения, да и вообще весьма смутно себе представляю как эти формулы преобразовать в код. Вообщем может ли кто нибудь привести реально работающий пример, желательно размытия гаусса ? )
привожу пример одного из фильтров который пытался делать я, может кто нить скажет в чем я не прав? )
Задача:
Метод Собела работает с двумерной апертурой 3х3 следующего вида: A1 A2 A3
A8 F A4
A7 A6 A5
X = ( A3 + 2 * A4 + A5 ) – ( A1 + 2 * A8 + A7 )
Y = ( A1 + 2 * A2 + A3 ) – ( A7 + 2 * A6 + A5 )
Сначала находятся значения переменных X и Y по приведённым выше формулам. После находится новое значение центрального элемента:
Далее то как я это закодил )
procedure MethodSobelaFilter(tBmp: TBitmap);
var
QP: TQuickPixels;
Pixel1: Cardinal;
r1: byte;
g1: byte;
b1: byte;
Intensity:integer;
X1:integer;
X2:integer;
Y1:integer;
Y2:integer;
x:integer;
y:integer;
// j:integer;
// i:integer;
jmin:integer;
imin:integer;
jmax:integer;
imax:integer;
A1:integer;
A2:integer;
A3:integer;
A4:integer;
A5:integer;
A6:integer;
A7:integer;
A8:integer;
appsize:byte;
begin
QP := TQuickPixels.Create;
QP.Attach(tBmp);
appsize:=3;
for y := 0 to QP.Height-1 do
begin
for x := 0 to QP.Width-1 do
begin
//Определим границы апертуры, чтобы не вылететь за границы изображения++
jmax:= y+trunc(appsize/2);
jmin:= y-trunc(appsize/2);
imax:= x+trunc(appsize/2);
imin:= x-trunc(appsize/2);
if jmax>(QP.Height-1) then jmax:= (QP.Height-1);
if jmin<0 then jmin:=0;
if imax>(QP.Width-1) then imax:=(QP.Width-1);
if imin<0 then imin:=0;
//Определим границы апертуры, чтобы не вылететь за границы изображения--
Pixel1 := QP.GetPixels24(imax,jmin);
r1 := (Pixel1 and $000000FF);
g1 := (Pixel1 and $0000FF00) shr 8;
b1 := (Pixel1 and $00FF0000) shr 16;
A3 := integer(77*r1 + 150*g1 + 29*b1) SHR 8;
Pixel1 := QP.GetPixels24(imax,jmax-1);
r1 := (Pixel1 and $000000FF);
g1 := (Pixel1 and $0000FF00) shr 8;
b1 := (Pixel1 and $00FF0000) shr 16;
A4 := integer(77*r1 + 150*g1 + 29*b1) SHR 8;
Pixel1 := QP.GetPixels24(imax,jmax);
r1 := (Pixel1 and $000000FF);
g1 := (Pixel1 and $0000FF00) shr 8;
b1 := (Pixel1 and $00FF0000) shr 16;
A5 := integer(77*r1 + 150*g1 + 29*b1) SHR 8;
Pixel1 := QP.GetPixels24(imin,jmin);
r1 := (Pixel1 and $000000FF);
g1 := (Pixel1 and $0000FF00) shr 8;
b1 := (Pixel1 and $00FF0000) shr 16;
A1 := integer(77*r1 + 150*g1 + 29*b1) SHR 8;
Pixel1 := QP.GetPixels24(imin,jmax-1);
r1 := (Pixel1 and $000000FF);
g1 := (Pixel1 and $0000FF00) shr 8;
b1 := (Pixel1 and $00FF0000) shr 16;
A8 := integer(77*r1 + 150*g1 + 29*b1) SHR 8;
Pixel1 := QP.GetPixels24(imin,jmax);
r1 := (Pixel1 and $000000FF);
g1 := (Pixel1 and $0000FF00) shr 8;
b1 := (Pixel1 and $00FF0000) shr 16;
A7 := integer(77*r1 + 150*g1 + 29*b1) SHR 8;
Pixel1 := QP.GetPixels24(imax-1,jmin);
r1 := (Pixel1 and $000000FF);
g1 := (Pixel1 and $0000FF00) shr 8;
b1 := (Pixel1 and $00FF0000) shr 16;
A2 := integer(77*r1 + 150*g1 + 29*b1) SHR 8;
Pixel1 := QP.GetPixels24(imax-1,jmax);
r1 := (Pixel1 and $000000FF);
g1 := (Pixel1 and $0000FF00) shr 8;
b1 := (Pixel1 and $00FF0000) shr 16;
A6 := integer(77*r1 + 150*g1 + 29*b1) SHR 8;
X1:= ( A3 + 2 * A4 + A5 );
X2:= ( A1 + 2 * A8 + A7 );
X1:= X1-X2;
Y1:= ( A1 + 2 * A2 + A3 );
Y2:= ( A7 + 2 * A6 + A5 );
Y1:= Y1-Y2;
Intensity:= Round(sqrt(sqr(X1)+sqr(Y1)));
IF Intensity < 0
THEN Intensity := 0
ELSE
IF Intensity > 255
THEN Intensity := 255;
QP.SetPixels24(X, Y, RGB(Intensity,Intensity,Intensity));
end;
end;
tBmp.SavetoFile("E:\test.bmp");
qp.Free;
end;
а енто результат: http://s55.radikal.ru/i150/1108/a5/2aae0f94745b.bmp,
Если руками отнять от яркости этак 200 то точек становится на экране больше, но исходного изображения там не разглядеть все равно )
← →
анонимус (2011-08-23 06:10) [1]а задаче Формула потерялась. " После находится новое значение центрального элемента:"
Вообщем центральный элемент матрицы F = sqrt(sqr(X)+ sqr(Y)). Вычисляется как квадратный корень из суммы квадратов Х и Y.
← →
han_malign (2011-08-23 12:59) [2]
> QP.GetPixels24
.....
> QP.SetPixels24
- а кто тебе сказал, что это фильтр рекуррентный?
← →
Sha © (2011-08-23 13:11) [3]> анонимус
> может кто нить скажет в чем я не прав?
меняешь входное изображения в процессе построения выходного
← →
анонимус (2011-08-23 17:43) [4]да, это действительно исправило ситуацию, но также показало что фильтры которые я юзал не годятся, т.к. они шрифты превращают в нечитаемое месиво. Хоть и объекты на картинке приобретают более четкие границы и всякие ужасы закрашиваются.
Пока лучшим из испробованных методов остается приведение в 2х цветный вид по средней яркости. В шрифтах он сохраняет наибольшее количество информации. Но практика показывает что средней яркости многовато, а если просто сохранить бмп в монохромный формат, то пропадает слишком много пикселей и некоторые слова становятся нечитаемыми вообще даже мной ) хотя для большей части картинки результат лучше чем по средней.
Может у кого есть идеи?
← →
Sha © (2011-08-23 19:35) [5]На большом белом заборе черной краской мелко написано одно слово.
На большом сером заборе черной краской мелко написано одно слово.
На большом белом заборе серой краской мелко написано одно слово.
Есть идеи?
← →
Anatoly Podgoretsky © (2011-08-23 19:57) [6]> Sha (23.08.2011 19:35:05) [5]
Есть, только за них бан
← →
анонимус (2011-08-23 20:16) [7]
> На большом белом заборе черной краской мелко написано одно
> слово.
> На большом сером заборе черной краской мелко написано одно
> слово.
> На большом белом заборе серой краской мелко написано одно
> слово.
>
> Есть идеи?
> > QP.GetPixels24
> .....
> > QP.SetPixels24
>
> - а кто тебе сказал, что это фильтр рекуррентный?
> <Цитата>
Господа, я конечно понимаю, что вы думаете, что вы пытаетесь объяснить что то очень важное, но на самом деле это не так.
← →
Sha © (2011-08-23 20:45) [8]Перестал думать
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.004 c