PDA

View Full Version : سوال: halftone Dithering



arashmidos2020
جمعه 10 اردیبهشت 1389, 20:09 عصر
سلام کسی در مورد الگوریتم halftone dither در پردازش تصویر می تونه توضیح بده؟
یا مثال حل کنه؟
تشکر

مصطفی ساتکی
شنبه 11 اردیبهشت 1389, 00:19 صبح
تصاویر halftone یا همان نیم تن. زمانی که ما برای نمایش تصاویر دوحالت داشته باشیم سیاه و سفید برای ایجاد سطوح خاکستری به صورت محدود از تکنیک halftone برای نمایش سایه ها در تصاویر استفاده می کنیم.از این تکنینک برای چاپ تصاویر در روزنامه های سیاه وسفید
و چاپگر های سوزنی و لیزری تک رنگ استفاده می شود. روش تبدیل یک تصویر رنگی به halftone ابتدا تصویر رنگی را grayscale نموده و سپس تصویر بدست آمده را به خانه های n*n میشکنیم.در اینجا n=3 می تونیم n=2 هم بگیریم کیفیت تصویر نهایی پایین تر میاد.با فرض اینکه n=3 کارمون ادامه می دیم.در این 9 خانه ما می تونیم 10 نمونه الگو داریم که هر کدوم از آنها معرف بازه ای از شدت می باشند . پس بازه 256 به 10 قسمت می شکینم .ما هر 9 خانه را میانگین می گیریم و از شدت بدست آمده را محاسبه می کنیم که در کدام یک از این 10 بازه قرار می گیرد سپس با بدست آمدن عدد مورد نظر پالت halftone آن را که آن هم 9 عنصر دارد جایگزین 9 پیکسل میانگین گرفته شده می کنیم با انجام این کار تصویر halftone بدست میاد.یک Source هم با زبان دلفی براتون گذاشتم که جزئیات بیشتر متوجه بشین.

procedure TForm2.GetHalfTone(ABitmap, AHalftone: TBitmap);
var Rows ,RowsHalf : PRows;
Halfs : Array[0..9] of THalf;
Row,Col : Integer;
i , j , m , n : Integer;
Sum : Integer;
Value : Byte;
Counter : Integer;
begin
AHalftone := CreateBitmap_(ABitmap);
SetRows_(ABitmap,Rows);
SetRows_(AHalftone,RowsHalf);

Halfs[0,0] := 0; Halfs[0,1] := 0; Halfs[0,2] := 0;
Halfs[0,3] := 0; Halfs[0,4] := 0; Halfs[0,5] := 0;
Halfs[0,6] := 0; Halfs[0,7] := 0; Halfs[0,8] := 0;

Halfs[1,0] := 0; Halfs[1,1] := 0; Halfs[1,2] := 0;
Halfs[1,3] := 0; Halfs[1,4] := 255; Halfs[1,5] := 0;
Halfs[1,6] := 0; Halfs[1,7] := 0; Halfs[1,8] := 0;

Halfs[2,0] := 0; Halfs[2,1] := 0; Halfs[2,2] := 0;
Halfs[2,3] := 255; Halfs[2,4] := 255; Halfs[2,5] := 0;
Halfs[2,6] := 0; Halfs[2,7] := 0; Halfs[2,8] := 0;

Halfs[3,0] := 0; Halfs[3,1] := 0; Halfs[3,2] := 0;
Halfs[3,3] := 255; Halfs[3,4] := 255; Halfs[3,5] := 0;
Halfs[3,6] := 0; Halfs[3,7] := 255; Halfs[3,8] := 0;

Halfs[4,0] := 0; Halfs[4,1] := 0; Halfs[4,2] := 0;
Halfs[4,3] := 255; Halfs[4,4] := 255; Halfs[4,5] := 255;
Halfs[4,6] := 0; Halfs[4,7] := 255; Halfs[4,8] := 0;

Halfs[5,0] := 0; Halfs[5,1] := 0; Halfs[5,2] := 255;
Halfs[5,3] := 255; Halfs[5,4] := 255; Halfs[5,5] := 255;
Halfs[5,6] := 0; Halfs[5,7] := 255; Halfs[5,8] := 0;

Halfs[6,0] := 0; Halfs[6,1] := 0; Halfs[6,2] := 255;
Halfs[6,3] := 255; Halfs[6,4] := 255; Halfs[6,5] := 255;
Halfs[6,6] := 255; Halfs[6,7] := 255; Halfs[6,8] := 0;

Halfs[7,0] := 255; Halfs[7,1] := 0; Halfs[7,2] := 255;
Halfs[7,3] := 255; Halfs[7,4] := 255; Halfs[7,5] := 255;
Halfs[7,6] := 255; Halfs[7,7] := 255; Halfs[7,8] := 0;

Halfs[8,0] := 255; Halfs[8,1] := 0; Halfs[8,2] := 255;
Halfs[8,3] := 255; Halfs[8,4] := 255; Halfs[8,5] := 255;
Halfs[8,6] := 255; Halfs[8,7] := 255; Halfs[8,8] := 255;

Halfs[9,0] := 255; Halfs[9,1] := 255; Halfs[9,2] := 255;
Halfs[9,3] := 255; Halfs[9,4] := 255; Halfs[9,5] := 255;
Halfs[9,6] := 255; Halfs[9,7] := 255; Halfs[9,8] := 255;

with ABitmap do
begin
Col := Width div 3;
Row := Height div 3;
end;

for i := 0 to Row - 1 do
for j := 0 to Col - 1 do
begin
Sum := 0;
for n := i*3 to ((i+1)*3-1) do
for m:= j*3 to ((j+1)*3-1) do
Sum := Sum + Rows[n,m];

Sum := Sum div 9;
Value := trunc (sum / 25.6);
if Value>9 then
Value := 9;

Counter := 0;
for n := i*3 to ((i+1)*3-1) do
for m:= j*3 to ((j+1)*3-1) do
begin
RowsHalf[n,m] := Halfs[Value,Counter] ;
inc(Counter);
end;

end;

AHalftone.SaveToFile('d:\half.bmp');

end;

arashmidos2020
شنبه 11 اردیبهشت 1389, 05:30 صبح
و هر ماتریس دایتر بزرگتر باشه شکل نتیجه هم بهتر خودش رو باید نشون بده. درسته؟

مصطفی ساتکی
شنبه 11 اردیبهشت 1389, 08:12 صبح
حد نرمالش 3*3 .ابعاد بالاتر برعکس کیفیتو پایین میاره بین 2 و 3 -حالت 3 بهتره

arashmidos2020
شنبه 11 اردیبهشت 1389, 08:47 صبح
ممنون منم کدی که با مطلب نوشتم رو گذاشتم اینجا.لطفا نگاه کنید اگر اسشتباهی توش هست بفرمایید.چون برای 3 و 4 عکس نتیجه فقط چند تا نقطه در تاریک ترین جاها رو نشون می ده!
ولی وقتی به 7 یا 8 می رسونم نتیجه بهتر می شه!
چرا؟؟

function[y]=Dither(im_buffer,D_Mat)
imshow(im_buffer);
pause(1);
im_buffer = rgb2gray(im_buffer);

imshow(im_buffer);
pause(1);

[H,V] = size(im_buffer);
[n,] = size(D_Mat);
tempIm = ones(H,V);
%doing halftoning
for x=1:H
for y=1:V
i = mod(x,n);
j = mod(y,n);

if i == 0
i =1;
end
if j == 0
j =1;
end

if im_buffer(x,y) > D_Mat(i,j)
tempIm(x,y) = 1;
else
tempIm(x,y) = 0;
end
end
end

imshow(tempIm);
imwrite(tempIm,'result.jpeg');
y = tempIm;
end

zizi_zizi69
شنبه 11 اردیبهشت 1389, 10:13 صبح
میشه در مورد سایر الگوریتم های Dithering هم توضیح بدهید
من در مورد Random Dithering و Error Diffusion اشکال دارم.