画像操作は、コンピュータービジョンと画像処理において重要な役割を果たします。これらの操作は、前処理、画像品質の向上、高度なアルゴリズムの有効化などのタスクにとって重要です。コンピューター ビジョンでは、サイズ変更、切り取り、明るさ/コントラスト/ガンマの調整、幾何学的変換などの操作が基本となります。これらにより、効率的な計算、関心領域の抽出、画像強度の正規化、および幾何学的キャリブレーションが可能になります。同様に、画像処理では、これらの操作は、ダウンサンプリング、不要な領域の切り取り、可視性と品質の向上、幾何学的操作の実行に不可欠です。 サイズ変更画像のサイズを変更することは、画像を特定のサイズに合わせたり、ファイル サイズを縮小したりするなど、さまざまな目的を達成するためにさまざまなシナリオでよく行われます。画像の補間と再サンプリングは、画像のサイズやスケールを調整するために画像処理やコンピューター ビジョンで使用される手法です。 画像補間画像補間は、既知のピクセル値に基づいて、画像内の不明な場所のピクセル値を推定するプロセスです。異なる補間方法では、異なる方法を使用して未知のピクセルの値を推定します。 最近傍補間は、不明なピクセル位置の値を最も近い既知のピクセル値に割り当てます。この方法はシンプルですが、ブロック状のアーティファクトが発生し、詳細が失われる可能性があります。 最近傍補間 双線形補間では、最も近い 4 つの既知のピクセルの値を考慮し、加重平均を計算して未知のピクセルの値を推定します。最近傍補間よりも滑らかな結果が生成されますが、それでも多少のぼやけが生じる可能性があります。 双三次補間は、より多くの隣接ピクセルを考慮し、三次多項式を使用してピクセル値を推定することで、双線形補間を拡張します。このアプローチにより、よりスムーズな遷移と画像の詳細のより良い保存により、より高品質な結果が得られます。 import cv2 import numpy as np def resize_image(image, scale, interpolation): width = int(image.shape[1] * scale) height = int(image.shape[0] * scale) resized_image = cv2.resize(image, (width, height), interpolation=interpolation) return resized_image SCALE = 4 # Load the image image_path = "image.png" image = cv2.imread(image_path) # Resize the image using nearest neighbor interpolation nearest_neighbor_resized = resize_image(image, scale=SCALE, interpolation=cv2.INTER_NEAREST) # Resize the image using bilinear interpolation bilinear_resized = resize_image(image, scale=SCALE, interpolation=cv2.INTER_LINEAR) # Resize the image using bicubic interpolation bicubic_resized = resize_image(image, scale=SCALE, interpolation=cv2.INTER_CUBIC) クロッピング画像をトリミングする目的は、不要なコンテンツを削除したり、特定の関心領域に焦点を当てたりすることです。トリミングにより、構図を洗練し、不要な部分を取り除き、画像内の重要な要素を強調することができます。不要な部分や無関係な部分を削除すると、視覚的に魅力的でインパクトのある画像が作成され、意図したメッセージやテーマを効果的に伝えることができます。 クリッピング領域を決定する方法はいくつかあります。 - 手動選択: 手動でトリミングするには、画像を視覚的に検査し、保持する領域を選択します。このアプローチは柔軟性を提供し、写真家やデザイナーの芸術的判断に基づいた主観的な決定を可能にします。
- オブジェクト検出: オブジェクト検出アルゴリズムに基づく自動トリミング技術により、画像内の特定のオブジェクトまたは被写体を識別して抽出できます。これらのアルゴリズムは、画像を分析し、事前定義されたパターンまたはトレーニングされたモデルに基づいてオブジェクトを特定します。検出されたオブジェクトは切り抜き領域として使用でき、無関係な背景や周囲の領域を削除しながら重要な要素を保持できます。
- セグメンテーション: セマンティック セグメンテーションやインスタンス セグメンテーションなどの画像セグメンテーション手法を使用して、画像を意味のある領域に分割できます。これらの技術は、さまざまなオブジェクトまたは領域にラベルまたはマスクを割り当て、特定の部分を切り取ったり、特定の関心領域を分離したりすることを可能にします。
import cv2 def crop_image(image, x, y, width, height): cropped_image = image[y:y+height, x:x+width] return cropped_image # Example usage image = cv2.imread("cath.jpeg") cropped_image = crop_image(image, x=400, y=500, width=300, height=200) cv2.imshow("Cropped Image", cropped_image) cv2.waitKey(0) cv2.destroyAllWindows() 調整明るさとコントラスト: 明るさとコントラストを調整することは、画像の視認性と視覚的な魅力を高めるために不可欠です。明るさを調整すると、画像を明るくしたり暗くしたりすることができ、露出不足または露出過度の領域の詳細が強調されます。コントラスト調整により、明るい部分と暗い部分の区別が強調され、画像がより鮮明でダイナミックに表示されます。 明るさとコントラストを制御することで、画像の全体的な品質と読みやすさが向上し、重要な特徴が明確に識別できるようになります。 import cv2 import numpy as np image_path = "cath.jpeg" def adjust_brightness(image, value): # Convert the image to the HSV color space hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # Split the channels h, s, v = cv2.split(hsv) # Apply the brightness adjustment v = cv2.add(v, value) # Clamp the values to the valid range of 0-255 v = np.clip(v, 0, 255) # Merge the channels back together hsv = cv2.merge((h, s, v)) # Convert the image back to the BGR color space adjusted_image = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR) return adjusted_image def adjust_contrast(image, value): # Convert the image to the LAB color space lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB) # Split the channels l, a, b = cv2.split(lab) # Apply the contrast adjustment l = cv2.multiply(l, value) # Clamp the values to the valid range of 0-255 l = np.clip(l, 0, 255) # Merge the channels back together lab = cv2.merge((l, a, b)) # Convert the image back to the BGR color space adjusted_image = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR) return adjusted_image # Load the image image = cv2.imread(image_path) # Adjust the brightness brightness_adjusted = adjust_brightness(image, value=50) # Adjust the contrast contrast_adjusted = adjust_contrast(image, value=2) # Display the original and adjusted images cv2.imshow("Original", image) cv2.imshow("Brightness Adjusted", brightness_adjusted) cv2.imshow("Contrast Adjusted", contrast_adjusted) cv2.waitKey(0) cv2.destroyAllWindows() ヒストグラム均等化ヒストグラム均等化はコントラストを高めるために使用される手法です。これは、ピクセル強度値を再分配して、より広い範囲の値をカバーすることによって実現されます。その主な目的は、画像全体のピクセル強度のより均一な分布を得ることです。 ヒストグラム均等化は、ピクセルの強度を再分配することで画像のコントラストを高めます。 import cv2 import matplotlib.pyplot as plt image_path = "cath.jpeg" image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) # Apply histogram equalization equalized_image = cv2.equalizeHist(image) # Calculate histograms hist_original = cv2.calcHist([image], [0], None, [256], [0, 256]) hist_equalized = cv2.calcHist([equalized_image], [0], None, [256], [0, 256]) # Plot the histograms plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1) plt.plot(hist_original, color='b') plt.title("Original Image Histogram") plt.xlabel("Pixel Intensity") plt.ylabel("Frequency") plt.subplot(1, 2, 2) plt.plot(hist_equalized, color='r') plt.title("Equalized Image Histogram") plt.xlabel("Pixel Intensity") plt.ylabel("Frequency") plt.tight_layout() plt.show() ヒストグラム # Display the original and equalized images fig, axes = plt.subplots(1, 2, figsize=(10, 5)) axes[0].imshow(image, cmap='gray') axes[0].set_title("Original") axes[0].axis("off") axes[1].imshow(equalized_image, cmap='gray') axes[1].set_title("Equalized") axes[1].axis("off") plt.tight_layout() plt.show()
画像を均等化する 線形スケーリング線形スケーリングはコントラスト ストレッチとも呼ばれ、元のピクセル値を新しい範囲に線形にマッピングすることで、画像の明るさとコントラストを調整するために使用されます。このプロセスでは、画像内の最小値と最大値に基づいてピクセル値を再スケーリングし、ダイナミック レンジ全体を活用します。 リニアスケーリングにより、明るさとコントラストの調整を正確に制御できます。特定の要件に応じて、必要な強度範囲を定義できます。 import cv2 import numpy as np import matplotlib.pyplot as plt # Load the image image_path = "cath.jpeg" image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) # Calculate the minimum and maximum pixel values in the image min_value = np.min(image) max_value = np.max(image) # Define the desired minimum and maximum intensity values for the output image new_min = 5 new_max = 10 # Perform linear scaling scaled_image = cv2.convertScaleAbs(image, alpha=(new_max - new_min) / (max_value - min_value), beta=new_min - min_value * (new_max - new_min) / (max_value - min_value)) # Display the original and scaled images fig, axes = plt.subplots(1, 2, figsize=(10, 5)) axes[0].imshow(cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)) axes[0].set_title("Original") axes[0].axis("off") axes[1].imshow(scaled_image, cmap='gray') axes[1].set_title("Scaled") axes[1].axis("off") plt.tight_layout() plt.show() 線形スケーリング ガンマ補正ガンマ補正は、画像入力ピクセル値とディスプレイ出力強度間の非線形強度関係を補正するために使用される技術です。これは、人間の視覚システムの光に対する非線形反応を考慮し、より正確で知覚的に一貫した画像表現を実現することを目的としています。 カメラで撮影された、または画像ファイルに保存されたピクセル値と、人間が知覚する明るさの関係は非線形です。つまり、ピクセル値が線形に増加しても、知覚される明るさは線形に増加するわけではありません。この非線形関係は、画像センサーと人間の視覚システムの応答特性によるものです。 ガンマ補正はガンマ (γ) と呼ばれるパラメータに基づいています。ガンマは、入力ピクセル値と表示される出力強度の関係を表します。これは、2 つの間の非線形マッピングの尺度です。 ガンマ補正は、ピクセル値にべき乗変換を適用し、強度値を調整して非線形応答を補正します。ガンマ補正の式は次のとおりです。 補正値 = 入力値 ^ (1 / ガンマ) ここで、入力値は元のピクセル値を表し、補正値は調整されたピクセル値を表します。 ガンマ補正の主な目的は、非線形の強度関係を補正し、画像の色と詳細が正確に表現されるようにすることです。ガンマ補正が重要な役割を果たす仕組みは次のとおりです。 - 明るさ補正: ガンマ補正は、キャプチャ デバイスと表示デバイス間の明るさの応答の違いを補正するのに役立ちます。これにより、表示される画像で知覚される明るさのレベルが元のシーンと一致することが保証されます。
- コントラストの強化: ガンマ補正は、色調値を再分配することで画像のコントラストを強化できます。ガンマ値に応じて、画像の暗い部分や明るい部分の細部を効果的に強調できます。
- 色の精度: ガンマ補正により、正確な色表現が実現します。ガンマ値を調整することで、色の再現性が向上し、色がより自然になり、元のシーンに忠実になります。
- トーン マッピング: ハイ ダイナミック レンジ (HDR) イメージングでは、シーンの広いダイナミック レンジをディスプレイ デバイスの限られたダイナミック レンジにマッピングするためのトーン マッピング手法の一部としてガンマ補正がよく使用されます。ガンマ補正は、シャドウ領域とハイライト領域の詳細を保持し、情報の損失を防ぎます。
- 知覚の一貫性: ガンマ補正は、表示される強度が人間の視覚と一致する、知覚的に一貫性のある画像を実現することを目的としています。ガンマ補正は非線形応答を補正することで、視聴者にとって画像が視覚的に心地よくリアルに見えるようにします。
import cv2 import numpy as np image_path = "cath.jpeg" def adjust_gamma(image, gamma): # Build a lookup table mapping the input pixel values to the corrected gamma values lookup_table = np.array([((i / 255.0) ** gamma) * 255 for i in np.arange(0, 256)]).astype(np.uint8) # Apply gamma correction using the lookup table gamma_corrected = cv2.LUT(image, lookup_table) return gamma_corrected # Load the image image = cv2.imread(image_path) # Adjust the gamma value gamma_value = 1.5 gamma_corrected = adjust_gamma(image, gamma_value) # Display the original and gamma-corrected images cv2.imshow("Original", image) cv2.imshow("Gamma Corrected", gamma_corrected) cv2.waitKey(0) cv2.destroyAllWindows() ガンマ補正 幾何学的変換幾何学的変換は、画像の遠近法、方向、空間関係を変更します。これらの変換は、画像の位置合わせ、オブジェクトの検出、画像の登録などのタスクのための基本的なツールを提供します。 (1)翻訳 変換は、指定された距離だけ画像を水平または垂直に移動する基本的な幾何学的変換です。 import cv2 import numpy as np image_path = "cath.jpeg" image = cv2.imread(image_path) # Define the translation matrix tx = 100 # pixels to shift in the x-axis ty = 50 # pixels to shift in the y-axis translation_matrix = np.float32([[1, 0, tx], [0, 1, ty]]) # Apply translation translated_image = cv2.warpAffine(image, translation_matrix, (image.shape[1], image.shape[0])) # Display the original and translated images cv2.imshow("Original", image) cv2.imshow("Translated", translated_image) cv2.waitKey(0) cv2.destroyAllWindows() パン (2)スケーリング スケーリングとは、すべての寸法に均一なスケーリング係数を適用するか、異なるスケーリング係数を使用して異なる寸法のサイズを変更することにより、画像のサイズを変更することを指します。ズームしました。 # Define the scaling factors scale_x = 1.5 # scaling factor for the x-axis scale_y = 0.8 # scaling factor for the y-axis # Apply scaling scaled_image = cv2.resize(image, None, fx=scale_x, fy=scale_y, interpolation=cv2.INTER_LINEAR) # Display the original and scaled images cv2.imshow("Original", image) cv2.imshow("Scaled", scaled_image) cv2.waitKey(0) cv2.destroyAllWindows() ズーム (3)回転 回転は、中心点を中心に指定された角度で画像の向きを変更する幾何学的変換です。 # Define the rotation angle angle = 30 # Perform rotation rows, cols = image.shape[:2] rotation_matrix = cv2.getRotationMatrix2D((cols / 2, rows / 2), angle, 1) rotated_image = cv2.warpAffine(image, rotation_matrix, (cols, rows)) # Display the original and rotated images cv2.imshow("Original", image) cv2.imshow("Rotated", rotated_image) cv2.waitKey(0) cv2.destroyAllWindows() 回転 |