Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การแสดงภาพ Grayscale OpenCV ด้วย Matplotlib

OpenCV อ่านภาพในรูปแบบ BGR (Blue-Green-Red) ในขณะที่ Matplotlib ใช้ RGB การแสดงภาพ Grayscale จาก OpenCV ใน Matplotlib ต้องแปลงสีพื้นที่ให้ถูกต้อง

ขั้นตอน

  1. อ่านภาพด้วย cv2.imread()
  2. แปลงจาก BGR เป็น Grayscale ด้วย cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  3. แสดงด้วย 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)