本文主要介紹如何使用Python將灰度圖片轉換成彩色圖片,涉及到的知識點有圖像處理的基礎知識、Python圖像處理庫Pillow的使用方法以及彩色處理的基本原理。
一、灰度圖像和彩色圖像的基本概念
在計算機圖像處理中,灰度圖像指的是每個像素點只有一種亮度的圖像,也就是黑白圖像。而彩色圖像,則是包含了RGB三個顏色通道的圖像,也就是彩色圖片。
在Pillow庫中,使用`Image.open()`打開一張圖片時,可以使用「L」參數讀取灰度圖像,使用「RGB」參數讀取彩色圖像。
from PIL import Image
img_gray = Image.open('gray_image.jpg').convert('L') # 讀取灰度圖像
img_color = Image.open('color_image.jpg').convert('RGB') # 讀取彩色圖像
二、如何將灰度圖像轉換成彩色圖像
將灰度圖像轉換成彩色圖像的本質是將每一個像素點的亮度值轉換成RGB三個通道的值,從而生成RGB三個通道的新圖像。
1. 使用LUT(查找表)方法
LUT(查找表)方法是最基本的灰度圖像轉彩色圖像的方法。
其思路是將RGB三個通道的值都與一張48*3的查找表進行映射,得到映射後的RGB三個通道的值,從而生成新的彩色圖像。
def gray_to_color_lut(img_gray, lut):
"""
使用LUT(查找表)方法將灰度圖像轉換成彩色圖像
:param img_gray: PIL.Image灰度圖像
:param lut: 48x3的查找表
:return: PIL.Image彩色圖像
"""
if not isinstance(img_gray, Image.Image):
return
img_color = Image.new("RGB", img_gray.size)
img_color_pixels = img_color.load()
# 轉換映射表為256位
lut256 = [tuple(map(lambda x: int(255 * x / 47), lut[i])) for i in range(48)]
# 處理每個像素點
for x in range(img_color.width):
for y in range(img_color.height):
gray_value = img_gray.getpixel((x, y))
img_color_pixels[x, y] = lut256[gray_value]
return img_color
2. 使用自然色彩方法
自然色彩方法是一種比較複雜的灰度圖像轉彩色圖像的方法。
其思路是將灰度值分成暗、中、亮三個部分,再根據顏色學的知識將對應的RGB值轉換成彩色圖像。
def gray_to_color_natural(img_gray):
"""
使用自然色彩方法將灰度圖像轉換成彩色圖像
:param img_gray: PIL.Image灰度圖像
:return: PIL.Image彩色圖像
"""
if not isinstance(img_gray, Image.Image):
return
img_color = Image.new("RGB", img_gray.size)
img_color_pixels = img_color.load()
# 定義顏色範圍
dark_range = (0, 49) # 暗色
mid_range = (50, 199) # 中等亮度
light_range = (200, 255) # 亮色
# 生成暗色片段的LUT映射表
dark_lut = [(0, 0, 0) for _ in range(50)]
for i in range(50, 200):
r = int((i - 50) * 239 / 150) + 16
g = int((i - 50) * 244 / 150) + 16
b = int((i - 50) * 255 / 150) + 16
dark_lut.append((r, g, b))
# 生成中等亮度片段的LUT映射表
mid_lut = [(0, 0, 0) for _ in range(50)]
for i in range(50, 200):
r = int((i - 50) * 109 / 150) + 146
g = int((i - 50) * 109 / 150) + 118
b = int((i - 50) * 109 / 150) + 73
mid_lut.append((r, g, b))
# 生成亮色片段的LUT映射表
light_lut = [(255, 255, 255) for _ in range(56)]
for i in range(200, 256):
r = int((i - 200) * 15 / 55) + 240
g = int((i - 200) * 15 / 55) + 240
b = int((i - 200) * 15 / 55) + 240
light_lut.append((r, g, b))
# 處理每個像素點
for x in range(img_color.width):
for y in range(img_color.height):
gray_value = img_gray.getpixel((x, y))
if gray_value in range(*dark_range):
img_color_pixels[x, y] = dark_lut[gray_value]
elif gray_value in range(*mid_range):
img_color_pixels[x, y] = mid_lut[gray_value]
elif gray_value in range(*light_range):
img_color_pixels[x, y] = light_lut[gray_value]
return img_color
三、總結
本文主要介紹了如何使用Python將灰度圖像轉換成彩色圖像,介紹了灰度圖像和彩色圖像的基本概念,以及兩種將灰度圖像轉換成彩色圖像的方法。
LUT(查找表)方法比較基礎,實現起來也比較簡單,但轉換出的彩色圖像質量一般。而自然色彩方法轉換出的彩色圖像質量相對較好,但實現起來比較複雜。
原創文章,作者:WXYHW,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/374525.html