そして、基本的な画像処理操作(パイソン)

PILは、一般的な画像処理機能を提供し、そのような画像スケーリング、クロッピング、回転、色変換等の基本的な画像操作の多数。

matplotlibのは pylab / pyplotインタフェースは画像を作成するために、多くのユーザーフレンドリーな機能が含まれているの下で、強力な描画機能を提供します。

画像データの処理を観察し、さらにするために、我々は最初のイメージファイルをロードする必要があり、画像データを表示するために、我々はそれを引き出す必要があります。

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

# 加载图像
img = Image.open("tmp.jpg")
# 转为数组
img_data = np.array(img)
# 可视化
plt.imshow(img_data)
plt.show()

画像については、我々は、画像と階調変換の回転、画像のサイズを変更するために、共通オペレーションを持っています

from PIL import Image
import matplotlib.pyplot as plt

img = Image.open("girl.jpg")

plt.figure()
# 子图
plt.subplot(221)
# 原图
plt.imshow(img)
plt.subplot(222)
# 将图像缩放至 256 * 256
plt.imshow(img.resize((256, 256)))
plt.subplot(223)
# 将图像转为灰度图
plt.imshow(img.convert('L'))
plt.subplot(224)
# 旋转图像
plt.imshow(img.rotate(45))
# 保存图像
plt.savefig("tmp.jpg")
plt.show()

デモンストレーション効果:

同じ(x、y)が必要とされる座標毎の閾値としてプロファイルを描画するために適用されるので、通常の使用では、画像の輪郭描画がしばしば使用される、画像のグレースケールする必要があります

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

img = Image.open("girl.jpg")

gray_img = np.array(img.convert('L'))
plt.figure()
# 绘制图像灰度化
plt.gray()
# 关闭坐标轴
plt.axis('off')
# 绘制灰度图像
plt.contour(gray_img, origin='image')
plt.figure()
# 绘制直方图,flatten()表示将数组展平
plt.hist(gray_img.flatten(), 128)
plt.show()

等高線図とヒストグラム:

画像のヒストグラムは、画像の画素値の分布を特徴づけるために使用されます。特徴付け指定するピクセル値のセル間の範囲の数と、各セル内のインター落下はセル範囲との間のピクセルの数で表されます。最初の入力パラメータ、セル間の数を指定する第2のパラメータとしてのみの一次元アレイを受け付ける画像ヒストグラムを描画するためのHIST()関数。

時には、ユーザーやアプリケーションは、画像のある時点でのマーカーとして、対話する必要があります。関数ginput Pylab / pyplotライブラリ()関数は、対話的にマークを達成することができます

from PIL import Image
import matplotlib.pyplot as plt


img = Image.open(r"girl.jpg")
plt.imshow(img)
x = plt.ginput(3)
print("clicked point: ", x)

注意:あなたがクリックすることができない対話型のウィンドウを立ち上げることができない場合は、この相互作用は、統合環境(pyCharm)は、成功したコマンドウィンドウを実行することができます。

我々()関数は、配列によってImageオブジェクトのnumpyの配列に変換されます上に、以下の配列からImageオブジェクトに変換する方法を紹介します

from PIL import Image
import numpy as np


img = Image.open(r"girl.jpg")
img_array = np.array(img)
img = Image.fromarray(img_array)

画像の階調変換の有用な例は、ヒストグラム等化変換された画像内の各階調値の確率分布が同じになるように、ヒストグラム等化は、平坦画像のグレースケールのヒストグラムです。ヒストグラム均等化は、通常、画像強度の非常に良い方法で正規化され、画像のコントラストを向上させることができます。

ヒストグラム等化変換関数は、画像の画素値である累積分布関数(累積分布関数、正規化された目標レンジ操作に画素値の範囲をマップします)。

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np


def histogram_equalization(img: np, nbr_bins=256):
    imhist, bins = np.histogram(img.flatten())
    cdf = imhist.cumsum() # 累计分布函数
    # 归一化
    cdf = 255 * cdf / cdf[-1]
    # 使用累积分布函数进行线性插值,计算新的像素值
    img2 = np.interp(img.flatten(), bins[:-1], cdf)
    return img2.reshape(img.shape), cdf


img = Image.open(r"girl.jpg").convert('L')
img2, cdf = histogram_equalization(np.array(img))
plt.figure()
plt.gray()
# 绘制子图
plt.subplot(232)
# 变换函数
plt.plot(cdf)
plt.subplot(231)
plt.hist(np.array(img).flatten(), 256)
# 关闭坐标轴,对上一个子图有效
plt.axis('off')
plt.subplot(233)
plt.hist(np.array(img2).flatten(), 256)
plt.axis('off')
plt.subplot(234)
plt.imshow(img)
plt.axis('off')
plt.subplot(236)
plt.imshow(img2)
plt.axis('off')
# 保存绘制图像
plt.savefig("tmp.jpg")
plt.show()

処理結果

可視、ヒストグラム均等化は、画像のコントラストを高め、原画像Bywayの灰色領域が明確になります。
PCA(主成分分析、主成分分析)は非常に便利な次元削減手法である、それは可能な限りの次元の数は、トレーニングデータの情報を維持するという前提の下でできるだけ使用することができます。詳細を参照してください私の他の記事を使用:PCAの次元削減を

scipyのダウンロードは、パッケージの数値計算のためのオープンソースツールに基づいてnumpyのを構築されています。scipyのダウンロードは数値積分、最適化、統計、信号処理を実現することができ、多くの効率的な運用を提供し、私たちのために最も重要な画像処理機能。

ガウスぼかしは画像畳み込みの古典的な例です。本質的には、画像(グレースケール)画像をぼかすことである\(I \)およびガウシアン畳み込み核を:
\ [I_ \シグマ= G_のI * \シグマ\]
前記\は(* \)畳み込み演算を表します; \ (G \)標準偏差を表し、\(\シグマ\)として定義され、二次元ガウスカーネル:
[G_ \シグマ= \ {2} \ 1 FRAC {\ PI \シグマ^ 2 ^ {E} - (。 X ^ 2 + y ^ 2)
/ 2 \シグマ^ 2} \] ガウスぼかし、一般に、画像補間演算、利息およびその他のコンピューティングアプリケーションの点のような他の画像処理操作の一部です。

便利なフィルタリング操作は、scipyのダウンロードscipy.ndimage.filtersモジュールを実行します。モジュールは、単離されたコンボリューションを計算するために、一次元高速な方法を使用します。使用します。

from PIL import Image
import numpy as np
from scipy.ndimage import filters


img = Image.open(r"girl.jpg").convert('L')
img = np.array(img)
img2 = filters.gaussian_filter(img, 2)
img3 = filters.gaussian_filter(img, 5)
img4 = filters.gaussian_filter(img, 10)

結果を描きます

パラメータにgaussian_filter上記で使用()関数は標準偏差を表し、\(\シグマ\)として見られる、(\ \シグマ\)増加し、画像はますます不鮮明になります。\(\シグマ\)より大きな画像の細部がより多くを処理した後に失われます。あなたは、カラー画像をぼかすしようとしている場合は、単純に各色のガウスぼかしをチャンネル:

from PIL import Image
import numpy as np
from scipy.ndimage import filters


img = Image.open(r"girl.jpg")
img = np.array(img)
img2 = np.zeros(img.shape)
for i in range(img2.shape[2]):
    img2[:, :, i] = filters.gaussian_filter(img[:, :, i], 5)
# 将像素值用八位表示
img2 = np.array(img2, 'uint8')

ファジィ結果:

多くのアプリケーションでは、画像強度の変化が強度の変化は、グレースケール画像を使用することができる、非常に重要である\(X \)\(Y \)方向誘導体\(I_x \)\(I_y \)記載の

画像の勾配ベクトルである(I = [I_x、I_y] ^ T \ bigtriangledown \)\します勾配の二つの重要な特性、ワンサイズの勾配がある:
\ [| \ I bigtriangledown | = \ ^ 2 + SQRT {I_x I_y} ^ 2 \]
画像強度の強度の変化を説明し、他の画像の角度であります:\
[\アルファ=上記Arctan2(I_x、I_y)\]
各点の変化方向における最大画像強度を記載します。()関数で上記Arctan2 numpyの、ラジアンする角度変動範囲署名された角度を返し\(( - \ PI、の\
\ PI))を離散的に使用して近似画像の導関数から計算することができます。最も単純に画像の逆畳み込みによって達成することができる:
\ [I_x I * = D_XとI_y = I *はD_y \]
する\(D_X \)\(D_y、\) 通常選択プレウィットフィルタ:
\ [D_X = \ [{行列}開始\左
\]右\ -1&0&1 \\ -1 0 1&\\ -1&0&1 \端{行列}] と
\ [D_y = \左[\始まります{行列} -1&-1&-1
\\ 0 0 0 \\ 1・1・1 \端{行列} \右] \] 又はSobelフィルタ
\ [D_X = \左[\
\]右\ {行列} -1&0&1 \\ -2 0 2 \\ -1&0&1 \端{行列}開始] と
\ [D_y = \左の[\ {行列}開始-1
および-2 -1 \\ 0 0 0 \\ 1&2&1 \端{行列} \右] \] これらの微分フィルタを用いてもよいscipy.ndimage.filters単純に実装するための標準的なコンボリューション・モジュール

from PIL import Image
import numpy as np
from scipy.ndimage import filters


img = Image.open(r"girl.jpg").convert('L')
img = np.array(img)
imgx = np.zeros(img.shape)
# Sobel导数滤波器
filters.sobel(img, 1, imgx)

imgy = np.zeros(img.shape)
filters.sobel(img, 0, imgy)

magnitude = np.sqrt(imgx**2+imgy**2)

ソーベル()関数は、第2のパラメータを選択する\(X \)または\(Y \)方向の誘導体を、第3の出力変数のパラメータが保存されています。画像において、明るい画素と正の誘導体は、暗画素として負の誘導体は、灰色の領域は、導関数の値がゼロに近づく表します。

欠陥誘導体画像が上記計算値:この方法では、フィルタは、画像の解像度が変化する変化スケーリングする必要があります(?) ノイズ画像の点でより堅牢、かつ任意のスケールで微分計算のために、我々は使用できガウシアン微分フィルタを:
[I_xはI * G _ {\シグマX}とI_yを= =私は_ {\ Gを* \
\シグマY}] 前記、\ (G _ {\シグマX} \)\(G _ {\シグマY } \) を表し\(G_を\シグマ\)\(X \)\(Y \)方向の誘導体、\(G_ \シグマ\)標準偏差を表し、\(\シグマ\)ガウス関数。下記の例を使用します。

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
from scipy.ndimage import filters

img = Image.open(r"girl.jpg").convert('L')
img = np.array(img)

sigma = 2
imgx = np.zeros(img.shape)
imgy = np.zeros(img.shape)
filters.gaussian_filter(img, (sigma, sigma), (0, 1), imgx)
filters.gaussian_filter(img, (sigma, sigma), (1, 0), imgy)

magnitude = np.sqrt(imgx**2+imgy**2)

結果は:

画像処理、ノイズ除去も非常に重要な部分であるとき。ノイズ除去が可能な構造的処理技術として、画像ノイズとイメージディテールを減らすことができ、我々は、デモを使用してROF雑音除去モデルの下に与えられています。

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
from scipy.ndimage import filters


def de_noise(img, U_init, tolerance=0.1, tau=0.125, tv_weight=100):
    U = U_init
    Px = Py = img
    error = 1
    while error > tolerance:
        Uold = U
        # 变量U梯度的x分量
        gradUx = np.roll(U, -1, axis=1)-U
        # 变量U梯度的y分量
        gradUy = np.roll(U, -1, axis=0)-U

        # 更新对偶变量
        PxNew = Px + (tau/tv_weight)*gradUx
        PyNew = Py + (tau/tv_weight)*gradUy
        NormNew = np.maximum(1, np.sqrt(PxNew**2+PyNew**2))

        # 更新x,y分量
        Px = PxNew / NormNew
        Py = PyNew / NormNew

        # 更新原始变量
        RxPx = np.roll(Px, 1, axis=1)  # 将x分量向x轴正方向平移
        RyPy = np.roll(Py, 1, axis=0)  # 将y分量向y轴正方向平移

        DivP = (Px - RxPx) + (Py - RyPy)  # 对偶域散度
        U = img + tv_weight * DivP

        error = np.linalg.norm(U - Uold)/np.sqrt(img.shape[0] * img.shape[1])

        return U, img-U


if __name__ == '__main__':
    im = np.zeros((500, 500))
    im[100:400,100:400] = 128
    im[200:300, 200:300] = 255
    im = im + 30 * np.random.standard_normal((500, 500))

    U, T = de_noise(im, im)
    G = filters.gaussian_filter(im, 10)
    plt.figure()
    plt.gray()
    plt.subplot(221).set_title("Original image")
    plt.axis('off')
    plt.imshow(im)
    plt.subplot(222).set_title("Gauss blurred image")
    plt.axis('off')
    plt.imshow(G)
    plt.subplot(223).set_title("ROF")
    plt.axis('off')
    plt.imshow(U)
    plt.savefig('tmp.jpg')
    plt.show()

結果発表

ROFは、画像のエッジをノイズ除去とボケながら、画像の構造情報を保存した後に「ノイズ」。

要素、np.linalg.norm(スルーnp.roll()関数缶サイクル)は、2つの配列間の差を測定するために使用されます。

無料の後に画像ノイズ除去を補完します

参考図書
Pythonのコンピュータビジョン

おすすめ

転載: www.cnblogs.com/zhhfan/p/11469803.html