ホームページ > バックエンド開発 > Python チュートリアル > [CVHSV と RGB: 画像処理における HSV の理解と活用

[CVHSV と RGB: 画像処理における HSV の理解と活用

Mary-Kate Olsen
リリース: 2024-12-19 10:33:10
オリジナル
267 人が閲覧しました

前回の投稿では、プロットや明るさとコントラストの調整など、OpenCV での RGB イメージの操作の基本について説明しました。 RGB 色空間は、画面から発せられる光の強さで色を表現するため、コンピューターのディスプレイには最適ですが、人間が自然界で色を認識する方法とは一致しません。ここで、HSV (色相、彩度、明度) が介入します。HSV (色相、彩度、明度) は、人間の知覚に近い方法で色を表現するように設計された色空間です。
この投稿では、HSV について詳しく説明し、そのコンポーネントを理解し、そのアプリケーションを探索し、画像を強化するためのいくつかの素晴らしいトリックを学びます。

HSVとは何ですか?

HSV は、色相、彩度、および値の略です:

  • 色相 (H): これは、赤、緑、青などの色のタイプを指します。従来は円形スペクトル (0° ~ 360°) で度単位で測定されていましたが、OpenCV では、色相は 0 にスケールされます。 8 ビット整数に収まるには –179。マッピングは次のとおりです:
  • 0 (またはそれに近い) は依然として赤を表します。
  • 60 ~ 89 は緑に対応します。
  • 120 ~ 149 は青に対応します。
  • 140–179 は赤に戻り、円形スペクトルが完成します。
  • 彩度 (S): これは色の強度または純度を定義します。完全に飽和した色には灰色が含まれず、鮮やかです。彩度が低い色はより色あせて見えます。

  • 値 (V): 明るさと呼ばれることが多く、明るさや暗さを測定します。これらのコンポーネントを分離することにより、HSV は、特に色の検出や強調などのタスクで画像の分析と操作を容易にします。色。

これをよりよく理解するために、プロット ブローは色空間の値をうまく表現したものです

[CVHSV vs RGB: Understanding and Leveraging HSV for Image Processing

OpenCV での画像の HSV への変換

OpenCV で画像を HSV に変換するには、cv2.cvtColor() 関数を使用するのが簡単です。見てみましょう:

import cv2
import matplotlib.pyplot as plt


image = cv2.imread('./test.png')
plt.figure(figsize=(10,10))
plt.subplot(1,2,1)
plt.imshow(image[:,:,::-1]) #plot as RGB 
plt.title("RGB View")
hsv= cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
plt.subplot(1,2,2)
plt.imshow(hsv)
plt.title("HSV View")
plt.tight_layout()
plt.show()

ログイン後にコピー
ログイン後にコピー

[CVHSV vs RGB: Understanding and Leveraging HSV for Image Processing

一見すると、HSV プロットは奇妙に見えるかもしれません。ほとんどエイリアンのようです。これは、HSV のコンポーネント (特に色相) が RGB 値に直接マッピングされていないにもかかわらず、コンピューターが HSV を RGB 画像として表現しようとしているためです。例:

  • 色相 (H): 角度として表され、OpenCV では 0 ~ 179 の範囲になります (RGB チャネルのような 0 ~ 255 ではありません)。これにより、RGB ベースのプロットでは色相チャネルが主に青で表示されます。

次の例では、プロフィール画像ではなく、Flux ai 画像生成モデルで生成された暗い画像を使用します。プロフィール画像よりも HSV のより良いユーザーケースを提供し、その効果をよりよく確認できるため

[CVHSV vs RGB: Understanding and Leveraging HSV for Image Processing

ヒストグラムを通じて HSV を理解する

RGB と HSV の違いをよりよく理解するために、各チャネルのヒストグラムをプロットしてみましょう。コードは次のとおりです:

import cv2
import matplotlib.pyplot as plt


image = cv2.imread('./test.png')
plt.figure(figsize=(10,10))
plt.subplot(1,2,1)
plt.imshow(image[:,:,::-1]) #plot as RGB 
plt.title("RGB View")
hsv= cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
plt.subplot(1,2,2)
plt.imshow(hsv)
plt.title("HSV View")
plt.tight_layout()
plt.show()

ログイン後にコピー
ログイン後にコピー

[CVHSV vs RGB: Understanding and Leveraging HSV for Image Processing

ヒストグラムから、HSV チャネルが RGB とどのように異なるかがわかります。 HSV の色相チャネルは 0 ~ 179 の値を持ち、個別の色領域を表し、彩度と値は強度と明るさを処理します。

色相、彩度、明度の視覚化

ここで、HSV 画像を個々のコンポーネントに分割して、各チャネルが何を表すかをよりよく理解しましょう。

# Plot the histograms
plt.figure(figsize=(10, 6))

# RGB Histogram
plt.subplot(1, 2, 1)
for i, color in enumerate(['r', 'g', 'b']):
    plt.hist(image[:, :, i].ravel(), 256, [0, 256], color=color, histtype='step')
    plt.xlim([0, 256])
plt.title("RGB Histogram")

# HSV Histogram
plt.subplot(1, 2, 2)
for i, color in enumerate(['r', 'g', 'b']):
    plt.hist(hsv[:, :, i].ravel(), 256, [0, 256], color=color, histtype='step')
    plt.xlim([0, 256])
plt.title("HSV Histogram")
plt.show()

ログイン後にコピー

[CVHSV vs RGB: Understanding and Leveraging HSV for Image Processing

  • 色相: 明確な色の区別を表示し、画像内の主要な色を強調表示します。
  • 彩度: 明るい領域は鮮やかな色を表し、暗い領域はより落ち着いた灰色がかった色調を示します。
  • 値: 明るさの分布を強調表示し、明るい領域がより明るく表示されます。

HSV のトリック

1. 明るさの向上(値の均一化)

照明が不均一な画像の場合、値チャンネルを均等化すると、明るい領域に「グロー」効果を与えながら、暗い領域をより見やすくすることができます。

# Plot the individual HSV channels
plt.figure(figsize=(10, 6))
plt.subplot(1, 3, 1)
plt.imshow(hsv[:, :, 0], cmap='hsv')  # Hue
plt.title("Hue")
plt.subplot(1, 3, 2)
plt.imshow(hsv[:, :, 1], cmap='gray')  # Saturation
plt.title("Saturation")
plt.subplot(1, 3, 3)
plt.imshow(hsv[:, :, 2], cmap='gray')  # Value
plt.title("Value")
plt.tight_layout()
plt.show()
ログイン後にコピー

[CVHSV vs RGB: Understanding and Leveraging HSV for Image Processing

2. カラーエンハンスメント(彩度等化)

彩度チャンネルを高めると、画像内の色がより鮮明で鮮やかになります。

equ = cv2.equalizeHist(hsv[:, :, 2])  # Equalize the Value channel
new_hsv = cv2.merge((hsv[:, :, 0], hsv[:, :, 1], equ))
new_image = cv2.cvtColor(new_hsv, cv2.COLOR_HSV2BGR)

# Display results
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title("Original Image")
plt.subplot(1, 2, 2)
plt.imshow(new_image)
plt.title("Brightness Enhanced")
plt.tight_layout()
plt.show()
ログイン後にコピー

[CVHSV vs RGB: Understanding and Leveraging HSV for Image Processing

3. カラーフィルタリング (赤の分離)

色相チャンネルを使用すると、特定の色を分離できます。たとえば、赤のトーンを抽出するには:

equ = cv2.equalizeHist(hsv[:, :, 1])  # Equalize the Saturation channel
new_hsv = cv2.merge((hsv[:, :, 0], equ, hsv[:, :, 2]))
new_image = cv2.cvtColor(new_hsv, cv2.COLOR_HSV2BGR)

# Display results
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title("Original Image")
plt.subplot(1, 2, 2)
plt.imshow(new_image)
plt.title("Color Enhanced")
plt.tight_layout()
plt.show()

ログイン後にコピー

[CVHSV vs RGB: Understanding and Leveraging HSV for Image Processing

このテクニックは、オブジェクト検出、色のセグメンテーション、さらには芸術的効果などのタスクに非常に役立ちます。

結論

HSV 色空間は、画像を分析および操作するための多用途かつ直感的な方法を提供します。 HSV は、色 (色相)、強度 (彩度)、明るさ (値) を分離することで、カラー フィルタリング、強調、セグメンテーションなどのタスクを簡素化します。 RGB はディスプレイに最適ですが、HSV は創造的で分析的な画像処理の可能性を広げます。

HSV のお気に入りのトリックは何ですか?以下であなたの考えを共有し、この鮮やかな色の世界を一緒に探索しましょう!

このバージョンには、読みやすさと理解を向上させるために、スムーズなフロー、詳細な説明、一貫した書式設定が組み込まれています。

以上が[CVHSV と RGB: 画像処理における HSV の理解と活用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート