PDA

View Full Version : سوال: پردازش تصویر : حذف پیکسل های سفید رنگ



مهران رسا
دوشنبه 01 شهریور 1389, 14:04 عصر
سلام ؛

میخوام پیکسل های سفید رنگ یک تصویر رو حذف کنم و تصویر جدید ایجاد شده رو ذخیره کنم . اینکار توسط چه توابع و کتابخانه هایی امکان پذیره ؟

BORHAN TEC
دوشنبه 01 شهریور 1389, 16:21 عصر
شاید روش بهتری هم باشه ولی من این کد رو نوشتم:

procedure TForm1.Button1Click(Sender: TObject);
var
bitmap: TBitmap;
bitmap2: TBitmap;
MyRect: TRect;
I: Integer;
j: Integer;
begin

MyRect.Top := -1;
MyRect.Left := -1;
MyRect.Right := -1;
MyRect.Bottom := -1;

bitmap := TBitmap.Create;
bitmap.LoadFromFile('c:\1.bmp');

for I := 1 to bitmap.Width do
for j := 1 to bitmap.Height do
if bitmap.Canvas.Pixels[I, j] <> bitmap.Canvas.Pixels[I - 1, j] then
if (bitmap.Canvas.Pixels[I, j] = clBlack) and (MyRect.Left = -1) and
(MyRect.Top = -1) then
begin
MyRect.Left := I;
MyRect.Top := j;
end
else if (bitmap.Canvas.Pixels[I, j] = clwhite) then
begin
MyRect.Right := I;
MyRect.Bottom := j;
end;
// end if
// end for
// end for

bitmap2 := TBitmap.Create;
bitmap2.SetSize(MyRect.Right - MyRect.Left,
MyRect.Bottom - MyRect.Top);


bitmap2.SetSize(MyRect.Right - MyRect.Left + 1,
MyRect.Bottom - MyRect.Top + 1);
bitmap2.Canvas.CopyRect
(Rect(-1 * MyRect.Left, -1 * MyRect.Top,MyRect.Right - MyRect.Left,
MyRect.Bottom - MyRect.Top), bitmap.Canvas, MyRect);
bitmap2.SaveToFile('c:\2.bmp');
end;

مهران رسا
دوشنبه 01 شهریور 1389, 17:57 عصر
ممنون ، اما رنگ مستطیل مشخص نیست . فقط پیکسل های سفید رنگ مدنظر ما هستن . برای حل این مسئله باید یکبار تمامی پیکسل های تصویر بررسی شده و موقعیت + رنگ پیکسل هایی که سفید رنگ نیستند در یک آرایه ذخیره بشه . و در نهایت پیکسل های ذخیره شده در همون موقعیت و با همون رنگ در تصویر جدید درج بشن . ضمن اینکه اندازه تصویر هم ثابت و از قبل تعیین شده هست .

vcldeveloper
دوشنبه 01 شهریور 1389, 18:45 عصر
و در نهایت پیکسل های ذخیره شده در همون موقعیت و با همون رنگ در تصویر جدید درج بشن . ضمن اینکه اندازه تصویر هم ثابت و از قبل تعیین شده هست .
خب، پس تکلیف اون پیکسل هایی که سفید بودند، چی میشه؟ اگر قراره سایر پیکلسل ها دقیقا در جای قبلی خودشان قرار داشته باشند، پس اون پیکسل های سفید هم باید با چیزی پر بشند. اگر قرار هست که این پیکسل ها با چیزی پر بشند، پس دیگه لزومی نداره که یک بار آدرس پیکسل های غیر سفید را ذخیره کنید، کافیه در حین اسکن، هر پیکسلی که سفید بود، همانجا رنگش تغییر داده بشه.

همچنین، به جای اینکه پیکلسل ها را یکی یکی از Bitmap بخونید، از نظر کارایی بهتر هست که متد ScanLine استفاده کنید، و در هر بار فراخوانی، یک سطر از پیکسل ها را بخوانید.