前回の投稿では、プロットや明るさとコントラストの調整など、OpenCV での RGB イメージの操作の基本について説明しました。 RGB 色空間は、画面から発せられる光の強さで色を表現するため、コンピューターのディスプレイには最適ですが、人間が自然界で色を認識する方法とは一致しません。ここで、HSV (色相、彩度、明度) が介入します。HSV (色相、彩度、明度) は、人間の知覚に近い方法で色を表現するように設計された色空間です。
この投稿では、HSV について詳しく説明し、そのコンポーネントを理解し、そのアプリケーションを探索し、画像を強化するためのいくつかの素晴らしいトリックを学びます。
HSV は、色相、彩度、および値の略です:
- 0 (またはそれに近い) は依然として赤を表します。
- 60 ~ 89 は緑に対応します。
- 120 ~ 149 は青に対応します。
- 140–179 は赤に戻り、円形スペクトルが完成します。
彩度 (S): これは色の強度または純度を定義します。完全に飽和した色には灰色が含まれず、鮮やかです。彩度が低い色はより色あせて見えます。
値 (V): 明るさと呼ばれることが多く、明るさや暗さを測定します。これらのコンポーネントを分離することにより、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()
一見すると、HSV プロットは奇妙に見えるかもしれません。ほとんどエイリアンのようです。これは、HSV のコンポーネント (特に色相) が RGB 値に直接マッピングされていないにもかかわらず、コンピューターが HSV を RGB 画像として表現しようとしているためです。例:
次の例では、プロフィール画像ではなく、Flux ai 画像生成モデルで生成された暗い画像を使用します。プロフィール画像よりも 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()
ヒストグラムから、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()
照明が不均一な画像の場合、値チャンネルを均等化すると、明るい領域に「グロー」効果を与えながら、暗い領域をより見やすくすることができます。
# 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()
彩度チャンネルを高めると、画像内の色がより鮮明で鮮やかになります。
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()
色相チャンネルを使用すると、特定の色を分離できます。たとえば、赤のトーンを抽出するには:
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()
このテクニックは、オブジェクト検出、色のセグメンテーション、さらには芸術的効果などのタスクに非常に役立ちます。
HSV 色空間は、画像を分析および操作するための多用途かつ直感的な方法を提供します。 HSV は、色 (色相)、強度 (彩度)、明るさ (値) を分離することで、カラー フィルタリング、強調、セグメンテーションなどのタスクを簡素化します。 RGB はディスプレイに最適ですが、HSV は創造的で分析的な画像処理の可能性を広げます。
HSV のお気に入りのトリックは何ですか?以下であなたの考えを共有し、この鮮やかな色の世界を一緒に探索しましょう!
このバージョンには、読みやすさと理解を向上させるために、スムーズなフロー、詳細な説明、一貫した書式設定が組み込まれています。
以上が[CVHSV と RGB: 画像処理における HSV の理解と活用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。