Pythonベースの画像強調技術

王林
王林オリジナル
2023-08-30 22:05:101193ブラウズ

このチュートリアルを理論用語から始めましょう。画像の強化について話すとき、それは基本的に、元の画像よりも適切な画像の新しいバージョンが必要であることを意味します。 たとえば、ドキュメントをスキャンすると、出力画像の品質が元の入力画像よりも低くなる可能性があります。したがって、出力画像の品質を向上させて、視聴者にとって視覚的により表現力豊かになる方法が必要であり、ここで画像強化が役立ちます。画像を強化するとき、私たちが行うことは、コントラストやエッジなどの画像の特徴を鮮明にすることです。

画像強調は画像の情報量を増やすものではなく、選択した特徴のダイナミック レンジを増やし、最終的に画像の品質を向上させることに注意してください。したがって、ここでは出力画像が実際にどのように見えるかはわかりませんが、出力画像の詳細を観察するなど、改善点があるかどうかを (主観的に) 知ることができるはずです。

画像強調は、デジタル画像処理 (つまり、セグメンテーション、表現) に含まれる基本ステップのうちの前処理ステップとしてよく使用されます。画像を強調するには多くの手法がありますが、このチュートリアルでは

画像逆変換

べき乗則変換 の 2 つの手法を紹介します。これらを Python で実装する方法を見ていきます。はじめましょう! 画像反転

このセクションのタイトル (イメージ反転とも呼ばれます) から推測できるように、イメージ反転の目的は、入力イメージの暗い強度をイメージの明るい強度に変換することです。出力画像の明度を出力画像の暗度に変換します。言い換えれば、暗い領域はより明るくなり、明るい領域はより暗くなります。

I(i,j)

は、(i,j) に位置するピクセルの強度値を参照するとします。ここで明確にするために、グレースケール イメージの強度値は [0,255] の範囲内に収まりますが、(i,j) はそれぞれ行と列の値を指します。画像逆演算子をグレースケール画像に適用すると、出力ピクセル O(i,j) 値は次のようになります。 リーリー 現在、ほとんどの画像はカラーです。これらのイメージには、red

greenblue の 3 つのチャネルが含まれており、RGB イメージと呼ばれます。この場合、上記の式とは反対に、各 チャネルの強度を 255 から減算する必要があります。したがって、出力画像はピクセル (i ,j): にあります。 リーリー 導入の後で、Python で画像逆演算子を実装する方法を見てみましょう。簡単にするために、この演算子をグレースケール イメージで実行することに注意してください。ただし、この演算子をカラー イメージに適用する方法についていくつかのアイデアを示し、完全なプログラムは演習として残しておきます。 カラー画像の場合、最初に行う必要があるのは、各ピクセル チャネル (RGB など) の強度値を抽出することです。これを行うには、Python イメージング ライブラリ (PIL) を使用できます。引き続き、baboon.png からヒヒのサンプル画像をダウンロードします。画像のサイズは

500x500

です。ピクセル位置

(325, 432)

で赤、緑、青の強度値を抽出するとします。これは次のように実行できます: リーリー ドキュメントによると、メソッド getpixel() の機能は次のとおりです。

指定された位置のピクセル値を返します。 上記のスクリプトを実行すると、次の結果のみが得られることがわかります:

138
!しかし、3 つのチャンネルの (RGB) 強度値はどこにあるのでしょうか?この問題は、読み取られている画像の
mode

に関連しているようです。次のステートメントを実行してパターンを確認します: リーリー 出力 P が得られます。これは、画像がパレット モードで読み取られたことを意味します。できることの 1 つは、さまざまなチャネルの強度値を返す前に、画像を RGB モードに変換することです。これを行うには、次のように

convert()

メソッドを使用します。 リーリー この場合、戻り値は (180, 168, 178) になります。これは、赤、緑、青チャネルの強度値がそれぞれ 180、168、178 であることを意味します。

これまで説明したことをすべてまとめると、画像の RGB 値を返す Python スクリプトは次のようになります:

リーリー イメージ逆演算子を続行する前に、あと 1 つのポイントが残っています。上の例は、 の RGB 値を 1 つの

ピクセルだけ取得する方法を示していますが、逆演算子を実行する場合は、

すべての

ピクセルに対してそれを行う必要があります。

各ピクセルの異なるチャネルのすべての強度値を印刷するには、次の操作を実行できます: リーリー この時点では、ピクセルごとにすべてのカラー画像チャネル (RGB など) に画像逆演算子を適用する方法を確認するための演習としてこれを残しておきます。

画像逆演算子をグレースケール画像に適用する例を見てみましょう。先に進んで、boat.png をダウンロードしてください。これは、このセクションのテスト イメージとして機能します。次のようになります:

Pythonベースの画像強調技術

我将使用 numpy 库来完成此任务。在上面的图像上应用图像逆运算符的 Python 脚本应如下所示:

import cv2
import numpy as np
from PIL import Image
img = Image.open('boat.png')
array_img = np.array(img)
image_invert = np.invert(array_img)
cv2.imwrite('new_boat.jpg', image_invert)

Numpy 是一个用于使用 Python 进行科学计算的 Python 包。 OpenCV-Python 是一个旨在解决计算机视觉问题的库。 OpenCV-Python 与 numpy 捆绑在一起,因此如果先安装 OpenCV-Python,则无需安装 numpy。我们首先用 Pillow 打开图像,然后将其转换为 numpy 数组。

然后我们使用numpy的invert()函数将图像反转并保存新的反转图像。 invert() 函数会将白色转换为黑色,反之亦然。

下面左边是原始图像,右边是新反转的图像。

Pythonベースの画像強調技術

请注意,应用该运算符后,图像的某些特征变得更加清晰。例如,看看右侧图像中的云彩和灯塔。

幂律变换

这个算子,也称为伽马校正,是我们可以用来增强图像的另一个算子。让我们看看算子方程。在像素 (i,j) 处,运算符如下所示:

p(i,j) = kI(i,j)^gamma

I(i,j) 是图像位置处的强度值 (i,j); kgamma 是正常数。我不会在这里讨论数学细节,但我相信您可以在图像处理书籍中找到该主题的详尽解释。但需要注意的是,在大多数情况下,k=1,所以我们主要是改变gamma的值。因此,上述方程可以简化为:

p(i,j) = I(i,j)^gamma

我将在这里使用 OpenCVNumPy 库。如果您需要了解有关该库的更多信息,请查看我的教程 NumPy 简介。我们的测试图像将再次是boat.tiff(继续下载它)。

执行幂律变换运算符的 Python 脚本如下所示:

import cv2
import numpy as np

im = cv2.imread('boat.tiff')
im = im/255.0
im_power_law_transformation = cv2.pow(im,0.6)
cv2.imshow('Original Image',im)
cv2.imshow('Power Law Transformation',im_power_law_transformation)
cv2.waitKey(0)

请注意,我们选择的 gamma 值是 0.6。下图显示了原始图像以及对该图像应用幂律变换算子的结果(左图为原始图像,右图为应用幂律变换算子后的结果)。

Pythonベースの画像強調技術

上面的结果是 gamma = 0.6 时的结果。让我们看看当我们将 gamma 增加到 1.5 时会发生什么,例如:

Pythonベースの画像強調技術

请注意,当我们增加伽马值时,图像会变得更暗,反之亦然。

您可能会问幂律变换有什么用处。事实上,用于图像采集、打印和显示的不同设备根据幂律变换算子进行响应。这是因为人脑使用伽马校正来处理图像。例如,当我们希望在计算机显示器或电视屏幕上正确显示图像(所有图像中显示最佳图像对比度)时,伽马校正就被认为很重要。

结论

在本教程中,您学习了如何使用 Python 增强图像。您已经了解了如何使用图像逆算子突出显示特征,以及如何将幂律变换视为在计算机显示器和电视屏幕上正确显示图像的关键算子。

以上がPythonベースの画像強調技術の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。