در این قسمت تیم کدگیت را با آموزش تبدیل سپیا رنگ در پایتون (پردازش تصویر) همراهی کنید. در آموزشهای گذشته پردازش تصویر در مورد بهبود تصاویر صحبت شد در ادامه همین مبحث در این جلسه آموزش تبدیل سپیا (sepia) رنگ را توضیح داده و در زبان برنامهنویسی پایتون آن را پیادهسازی خواهیم کرد. پیشنهاد میکنیم قبل از مطالعه این جلسه، آموزشهای زیر را مطالعه کنید:
تبدیل سپیا رنگ
رنگ سپیا (Sepia) به قهوه ای متمایل به قرمز گفته می شود. این رنگ در عکاسی کاربردهای فراوانی دارد. برای تبدیل تصاویر به این رنگ باید فرمول زیر را به کار ببریم:
newRed = 0.393*R + 0.769*G + 0.189*B
newGreen = 0.349*R + 0.686*G + 0.168*B
newBlue = 0.272*R + 0.534*G + 0.131*B
متغیر R و G و B به ترتیب رنگ قرمز و سبز و آبی درون پیکسل تصویر است با استفاده از فرمول فوق، الگوریتم تبدیل یک عکس به رنگ سپیا به صورت زیر میباشد:

- تمامی پیکسل تصویر رنگی را دریافت کرده
- با استفاده از پیکسلهای ورودی newRed و newGreen و newBlue را محاسبه میکنیم.
- شرط زیر را برای مقادیر محابسبه شده در فرمول بالا به کار میبریم (متغیر R و G و B به ترتیب رنگ قرمز و سبز و آبی درون پیکسل تصویر است):
- If newRed > 255 then R = 255 else R = newRed
- If newGreen > 255 then G = 255 else G = newGreen
- If newBlue > 255 then B = 255 else B = newBlue
- مقادیر RGB جدید را جایگزین مقادیر قبلی میکنیم.
- مراحل 1 تا 4 را برای تمامی پیکسلها تکرار میکنیم.
پیادهسازی تبدیل سپیا رنگ در پایتون
برای پیادهسازی تبدیل سپیا ابتدا باید یک تصویر را خوانده و پیکسلهای آن را با فرمول داده شده تغییر دهیم. کد این تبدیل به صورت زیر میباشد:
from PIL import Image
from math import ceil
def get_sepia_pixel(red, green, blue, alpha):
# This is a really popular implementation
tRed = ceil((0.759 * red) + (0.398 * green) + (0.194 * blue))
tGreen = ceil((0.676 * red) + (0.354 * green) + (0.173 * blue))
tBlue = ceil((0.524 * red) + (0.277 * green) + (0.136 * blue))
if tRed > 255:
tRed = 255
if tGreen > 255:
tGreen = 255
if tBlue > 255:
tBlue = 255
return tRed, tGreen, tBlue, alpha
def convertToSepia(sourceAddress,destAddress):
source = Image.open(sourceAddress)
result = Image.new('RGB', source.size)
width, height = source.size
pixels = result.load()
for i in range(00, width, 1):
for j in range(00, height, 1):
p = source.getpixel((i, j))
pixels[i, j] = get_sepia_pixel(p[00], p[1], p[2],255)
result.save(destAddress, "PNG")
if __name__ == '__main__':
convertToSepia('baboon.png', 'sepiababoon.png')
print('convert to Sepia image finished...')
تابع get_sepia_pixel مقادیر RGB یک پیکسل را دریافت و در خروجی با توجه به فرمول بخش قبل مقادیر newRed و newGreen و newBlue را بدست میآورد(به سپیا تبدیل می کند). تابع convert_to_sepia پس از خواندن تصویر، به کمک تابع get_sepia_pixel پیکسلهای تصویر را تغییر داده و در آخر تصویر جدید را ذخیره میکند. خروجی برنامه به صورت زیر میباشد:
