پردازش تصویر

چگونه می‏توان تصاویر رنگی را به طیف خاکستری تبدیل کرد؟

چند روز پیش در نوشته پیدایش فوتوشاپ نوشتم که توماس پس از خرید کامپیوتر مکنتاش خودش از این که نمی‏تواند تصاویر رنگی را به تصاویر طیف خاکستری تبدیل کند، ناراحت بود و خودش برنامه کوچکی را برای تبدیل تصاویر رنگی به تصاویر طیف خاکستری نوشت.

خوب راستش تابع تبدیل تصاویر رنگی به طیف خاکستری خیلی ساده‏تر از آن چیزی است که به نظر می‏آید. من در این نوشته این تابع را آورده‏ام و درباره آن توضیحاتی هم می‏دهم. اما پیش از این باید توضیحی درباره تصاویر Black and White و تصاویر Grayscale بدهم. تصاویر Black and White یعنی تصاویری که تنها و تنها در ساخت آنها از دو رنگ سیاه و سفید استفاده شده است. اما تصاویر Grayscale تصاویری هستند که رنگهای آن از طیف خاکستری تشکیل شده است. بدبختانه ما در فارسی برای هر دو نوع تصاویر واژه «سیاه و سفید» را به کار می‏گیریم.
به هر روی من در این نوشته تابع تبدیل تصاویر رنگی به تصاویر طیف خاکستری یا Grayscale در C را آورده‏ام:

for(i=0;iw-1;i++){
for(j=0;jh-1;j++){

color=getpixel(temp,i,j);
r=getr32(color);
g=getg32(color);
b=getb32(color);

h=(r+b+g)/3;
putpixel(temp1,i,j,makecol(h,h,h));
}
}

در این تابع با کمک دو حلقه تو در تور تمامی پیکسلها ستون به ستون و سپس پیکسل به پیکسل پیمایش شده است. تابع getpixel رنگ پیکسل فعلی را می‏خواند و سپس رنگ استخراج شده به کمک تابع getr32 و getg32 و getb32 به سه رنگ قرمز، سبز و آبی تجزیه می‏شود. این توابع روی تصاویر 32 بیتی (تصاویری که هر رنگ در 32 بیت نوشته شده است و بنابراین در این تصاویر می‏توان 4,294,967,296 رنگ را به کار گرفت) کار می‏کنند. تابعهای مشابهی برای کار کردن با تصاویر 24، 16، 15، 8، 7، 4 و 2 بیتی هم وجود دارد. بنابراین در این تابع فرض بر این گذاشته شده است که تصویر ورودی 32 بیت است. پس از این Hue رنگ با کمک فرمول ساده r+b+g/3 استخراج شده است. درباره Hue که یکی از ویژگی‏های فضای رنگی HSV یا HSL است اینجا بخوانید.
سپس با به کار گیری تابع MakeCol یک رنگ جدید ساخته شده است و با کمک تابع PutPixel رنگ جدید در تصویر اولیه گنجانده شده است.

مهمترین نکته‏ای که در این کد وجود دارد، روش تبدیل پیکسل رنگی به برابر طیف خاکستری آن است. نخست باید بدانیم که تمامی رنگهای Grayscale دارای مقادیر یکسان RGB هستند. یا به عبارت دیگر هر رنگی که دارای مقادیر یکسان R و G و B باشد یک رنگ Grayscale است. روش به کار رفته در این کد هم بر پایه همین اصل است.

مقادیر RGB تمام رنگهای Grayscale یکسان هستندمقادیر RGB تمام رنگهای Grayscale یکسان هستند

ابتدا مقدار Hue که مهمترین مولفه تشکیل دهنده یک رنگ در فضای رنگی HSV یا HSL است استخراج شده است و رنگی تشکیل شده است که مقدار R و G و B در آن برابر با مقدار Hue استخراج شده است.

Syndicate content