PDA

View Full Version : سوال: کار با عکس



sara66
چهارشنبه 24 فروردین 1390, 21:36 عصر
سلام ، یکسری عملیات هست که باید روی عکس انجام بدم ، اگر میشه راهنمایی کنید لطفا که چجوری پیاده سازی کنم :

1 - تغییر ابعاد عکس ، مثلا عکس 800*600 را به 400*300 تبدیل کنم بدون اینکه بخشی از عکس حذف بشه
2 - اجرای افکت روی عکس مثل افکت سیاه و سفید
3 - مقایسه 2 عکس باهم و نمایش تفاوت های دو عکس
4 - کار با عکس به صورت پیکسل پیکسل ، من برای تشخیص رنگ پیکسل ها از کد زیر استفاده می کنم اما فقط نام رنگ را برمیگردونه ، من میخوام رنگ به صورت RGB باشه و هر سه پارامتر را داشته باشم


image1.canvas.pixels[1,1]

SAASTN
چهارشنبه 24 فروردین 1390, 23:06 عصر
1 - تغییر ابعاد عکس ، مثلا عکس 800*600 را به 400*300 تبدیل کنم بدون اینکه بخشی از عکس حذف بشه
اگه تنها از نظر نمایشی می خواید سایز عکس رو تغییر بدید از خود مشخصات TImage می تونید استفاده کنید، پروپرتی هایی مثل: AutoSize, Center, IncrementalDisplay, Stretch
اما اگه می خواید این تغییرات روی فایل هم اعمال بشه دم دست ترین راه استفاده از Canvas.CopyRect هست که کادر مبدا و مقصد رو میگیره و در صورتی که هم سایز نباشن تصویر رو Resize می کنه. اما اگه کیفیت تصویر Resize شده براتون مهم باشه باید دنبال الگوریتم های دیگه بگردید یا از کامپوننت ها استفاده کنید. Graphic32 گزینه سریع و کاراییه.

2 - اجرای افکت روی عکس مثل افکت سیاه و سفید
همین امروز توی یه تاپیک دیگه آقای تاجیک کدی رو قرار دادن که با اندکی تغییر این کار رو انجام میده:
http://barnamenevis.org/showthread.php?282543-%DA%86%DA%AF%D9%88%D9%86%D9%87-%D9%85%DB%8C-%D8%AA%D9%88%D8%A7%D9%86-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1-%D8%B1%D8%A7-Invert-color-%DA%A9%D8%B1%D8%AF%D8%9F&p=1246309&viewfull=1#post1246309
البته افکتی که ما در محاوره سیاه و سفید می گیم معادل Grayscale هست و با Black&White متفاوته. اما الگوریتم رسیدن به این دو خیلی شبیه به هم هست.

3 - مقایسه 2 عکس باهم و نمایش تفاوت های دو عکس
منظور چه تفاوتی هست و به چه صورت می خواید نمایش پیدا کنه؟ این سوال خیلی کلی هست و یکم میزنه به عصبی. اما اگه منظورتون تنها تفاوت پیکسل به پیکسل باشه باید اختلاف بین مقدارهای دو پیکسل رو (حالا بر اساس فاکتور های متفاوتی می تونه باشه) بدست بیارید و یجور جلوه گرافیکی بهش بدید.

4 - کار با عکس به صورت پیکسل پیکسل ، من برای تشخیص رنگ پیکسل ها از کد زیر استفاده می کنم اما فقط نام رنگ را برمیگردونه ، من میخوام رنگ به صورت RGB باشه و هر سه پارامتر را داشته باشم
Canvas.Pixels مقدار رنگ هر پیکسل رو برمی گردونه که از نوع TColor هست و خود TColor چهاربایتی هست و مقادیر RGB رو در خودش ذخیره می کنه، اون اسامی که می بینید برای یه سری از رنگهای پرکاربرد و رنگ های سیستمی بصورت ثابت تعریف شده. برای بدست آوردن مولفه های R,G و B باید از GetRValueو GetGValue و GetBValue استفاده کنید. اما برای دسترسی به مقادیر رنگی پیکسل ها خصوصا برای کارهای پردازشی استفاده از Canvas.Pixels توصیه نمی شه، چون سرعت پائینی داره. بهتره از Bitmap.Scanline استفاده کنید. یه نمونه برای استفاده از Scanline توی همون تاپیک قبلی که لینک دادم هست.

Felony
پنج شنبه 25 فروردین 1390, 02:59 صبح
اگه تنها از نظر نمایشی می خواید سایز عکس رو تغییر بدید از خود مشخصات TImage می تونید استفاده کنید، پروپرتی هایی مثل: AutoSize, Center, IncrementalDisplay, Stretch
اما اگه می خواید این تغییرات روی فایل هم اعمال بشه دم دست ترین راه استفاده از Canvas.CopyRect هست که کادر مبدا و مقصد رو میگیره و در صورتی که هم سایز نباشن تصویر رو Resize می کنه. اما اگه کیفیت تصویر Resize شده براتون مهم باشه باید دنبال الگوریتم های دیگه بگردید یا از کامپوننت ها استفاده کنید. Graphic32 گزینه سریع و کاراییه.
برای تغییر سایز عکس بهترین گزینه خود دلفی ، متد Canvas.StretchDraw هست که کیفیت عکس رو هم پائین نمیاره .

sara66
پنج شنبه 25 فروردین 1390, 06:54 صبح
مرسی فوقالعاده بود مرسی
من یکم کار می کنم با این توضیحاتی که دادید ، اگر مشکلی بود همینجا مطرح می کنم

sara66
پنج شنبه 25 فروردین 1390, 12:01 عصر
چجوری میشه رنگ را تشخیص داد ؟ مثلا رنگ قرمز ! آخه توی عکس با چشم که نگاه میکنی قرمز دیده میشه اون جسم اما توی برنامه که کد رنگش را نگاه میکنی میبینی تک تک پیکسلهاش با هم فرق می کنن ، اما کل جسم قرمز هست

Felony
پنج شنبه 25 فروردین 1390, 13:05 عصر
اکثر اوقات رنگ هر پیکسل با پیکسل کناریش در عکس هایی که توسط دوربین گرفته میشه متفاوت هست چون شدت نور متفاوت هست ، مگر اینکه مثلا خودتون با Paint یک دایره قرمز کشیده باشید که در این صورت همه پیکسل ها یک رنگ هستند ، برای اینکه یک رنگ رو تشخیص بدید باید برای بررسی تون یک محدوده تعریف کنید ؛ مثلا در کد زیر که نوشتم محدوده ای از عکس که رنگ قرمزش بیشتر از 50 و رنگ سبز و آبیش کمتر از 80 باشه به رنگ مشکی در میاد :

var
aBitmap: TBitmap;
X, Y: Integer;
Co: TColor;
begin
// Convert current image to bitmap
aBitmap:= TBitmap.Create;
try
aBitmap.Assign(Image1.Picture.Graphic);
Image1.Picture.Assign(aBitmap);
finally
aBitmap.Free;
end;
// Check Red pixels and convert it to black
for X:= 0 to Image1.Picture.Width do
for Y:= 0 to Image1.Picture.Height do
begin
Co:= Image1.Canvas.Pixels[X, Y];
if (GetRValue(Co) > 50) and (GetGValue(Co) < 80) and (GetBValue(Co) < 80) then
Image1.Canvas.Pixels[X, Y]:= clBlack;
end;
end;

نمونه برنامه رو هم میتونید از ضمیمه دریافت کنید .

مصطفی ساتکی
پنج شنبه 25 فروردین 1390, 17:30 عصر
چجوری میشه رنگ را تشخیص داد ؟ مثلا رنگ قرمز ! آخه توی عکس با چشم که نگاه میکنی قرمز دیده میشه اون جسم اما توی برنامه که کد رنگش را نگاه میکنی میبینی تک تک پیکسلهاش با هم فرق می کنن ، اما کل جسم قرمز هستبراي انجام چنين عملي بايستي quantization روي تصويرتون اعمال كنيد و سپس clustering روي تصوير صورت بگيره كه مي تونه Fuzzy kmean باشه ودر نهايت Segmentation و Lable گذاري روي Object‌هاي هدف.
و بهتر كه كليه موارد بالا در فضاي رنگي HSL صورت بگيره.

sara66
پنج شنبه 25 فروردین 1390, 18:47 عصر
Canvas.Pixels مقدار رنگ هر پیکسل رو برمی گردونه که از نوع TColor هست و خود TColor چهاربایتی هست و مقادیر RGB رو در خودش ذخیره می کنه، اون اسامی که می بینید برای یه سری از رنگهای پرکاربرد و رنگ های سیستمی بصورت ثابت تعریف شده. برای بدست آوردن مولفه های R,G و B باید از GetRValueو GetGValue و GetBValue استفاده کنید. اما برای دسترسی به مقادیر رنگی پیکسل ها خصوصا برای کارهای پردازشی استفاده از Canvas.Pixels توصیه نمی شه، چون سرعت پائینی داره. بهتره از Bitmap.Scanline استفاده کنید. یه نمونه برای استفاده از Scanline توی همون تاپیک قبلی که لینک دادم هست.
مرسی ، من مثال را نگاه کردم اما نتونستم از Scanline استفاده کنم ، مثلا اگر کد زیر را بخوام با اسکن لاین بنویسم چجوری ؟


for i:=0 to image1.picture.height do
for j:= 0 to image1.picture.width do
a:= GetRvalue( image1.canvas.pixels[i,j] )

vcldeveloper
پنج شنبه 25 فروردین 1390, 19:29 عصر
هر سوالتون رو در یک تاپیک بپرسید، الان با این چند سوالی که پرسیدید، ظرف چند روز تاپیک تبدیل میشه به کلافی سر در گم از پست های مختلف که هر کدوم به یکی از سوال های شما مربوط میشند.
تاپیک قفل شد.