OpenCV อ่านภาพในรูปแบบ BGR (Blue-Green-Red) ในขณะที่ Matplotlib ใช้ RGB การแสดงภาพ Grayscale จาก OpenCV ใน Matplotlib ต้องแปลงสีพื้นที่ให้ถูกต้อง
ขั้นตอน
- อ่านภาพด้วย
cv2.imread() - แปลงจาก BGR เป็น Grayscale ด้วย
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - แสดงด้วย
plt.imshow(image, cmap='gray')ระบุ cmap='gray' สำคัญมาก
ตัวอย่างโค้ด
import cv2
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["figure.figsize"] = [12, 6]
plt.rcParams["figure.autolayout"] = True
# โหลดภาพ (สร้างภาพทดสอบหากไม่มีไฟล์)
try:
img_bgr = cv2.imread("baseball.png")
if img_bgr is None:
raise FileNotFoundError
except:
# สร้างภาพสังเคราะห์
img_bgr = np.zeros((400, 600, 3), dtype=np.uint8)
# วาดวงกลมสีต่างๆ
cv2.circle(img_bgr, (150, 200), 80, (255, 0, 0), -1) # Blue
cv2.circle(img_bgr, (300, 200), 80, (0, 255, 0), -1) # Green
cv2.circle(img_bgr, (450, 200), 80, (0, 0, 255), -1) # Red
cv2.putText(img_bgr, "OpenCV BGR Image", (150, 350), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 2)
# แปลง BGR -> Grayscale
img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
# แปลง BGR -> RGB สำหรับแสดงภาพต้นฉบับใน Matplotlib
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
# แสดงผล
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
# ภาพต้นฉบับ (BGR -> RGB)
axes[0].imshow(img_rgb)
axes[0].set_title('Original (BGR→RGB)', fontsize=12)
axes[0].axis('off')
# ภาพ Grayscale
axes[1].imshow(img_gray, cmap='gray') # สำคัญ: cmap='gray'
axes[1].set_title('Grayscale (cv2.COLOR_BGR2GRAY)', fontsize=12)
axes[1].axis('off')
# ภาพ Grayscale ไม่ระบุ cmap (จะผิด - ใช้ Colormap Default)
axes[2].imshow(img_gray) # ไม่มี cmap='gray'
axes[2].set_title('Grayscale WITHOUT cmap=gray (Wrong!)', fontsize=12, color='red')
axes[2].axis('off')
plt.suptitle('OpenCV Grayscale Display in Matplotlib', fontsize=16)
plt.show()
ผลลัพธ์
Subplot 1: ภาพสีปกติ (RGB) | Subplot 2: ภาพ Grayscale ถูกต้อง (cmap='gray') | Subplot 3: ภาพ Grayscale ไม่ระบุ cmap - ใช้ Viridis Colormap ผิดพลาด
⚠️ ข้อผิดพลาดที่พบบ่อย
| ผิด | ถูกต้อง |
|---|---|
plt.imshow(cv2.imread('img.jpg')) | plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) |
plt.imshow(gray_img) | plt.imshow(gray_img, cmap='gray') |
cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) | cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) |
การแปลงสีที่เกี่ยวข้อง
# BGR (OpenCV) -> RGB (Matplotlib) img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB) # BGR -> Grayscale img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY) # RGB -> Grayscale (ถ้าภาพมาจาก Matplotlib/PIL) img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY) # Grayscale -> BGR (3 Channel) img_bgr = cv2.cvtColor(img_gray, cv2.COLOR_GRAY2BGR) # Grayscale -> RGB img_rgb = cv2.cvtColor(img_gray, cv2.COLOR_GRAY2RGB)
คำแนะนำ
- เสมอ ใช้
cmap='gray'สำหรับภาพ Grayscale ใน Matplotlib - OpenCV ใช้ BGR, Matplotlib/PIL/ส่วนใหญ่ ใช้ RGB
- ใช้
cv2.COLOR_BGR2GRAYไม่ใช่ RGB2GRAY สำหรับภาพจาก cv2.imread() - สำหรับการประมวลผลต่อ ให้อยู่ใน Domain เดียว (OpenCV = BGR/Gray, Matplotlib = RGB)