記事のディレクトリ
序文
学習ブログをブログガーデンに配置する前のリンクは次のとおりです。
ブログガーデンリンク。ブログガーデン
のシステム障害とページビューが少ない理由に遭遇したので、CSDNと一緒に更新することにしました。
前学期のデジタル画像コースでは、最初にデジタル画像処理のコースに触れましたが、前学期は基本的な画像処理を実現するためにmatlabを使用しましたが、このコースではpython + opencvを使用して画像処理を実現しました。 。
私はPycharmを使ってプログラミングしています。
参考書の資料:Pythonコンピュータービジョンプログラミング
1.グレースケール画像?
白と黒の対数関係は、グレースケールと呼ばれるいくつかのレベルに分けられます。グレースケールは256レベルに分割されています。
グレースケールで表現された画像は、グレースケール画像と呼ばれます。
すべての色は、赤、緑、青の3原色(RGB)で構成され、グレースケール画像には256のグレーレベルを持つチャネルが1つだけあり、255はすべて白、0はすべて黒を表します。
一般的な衛星画像や航空写真に加えて、多くの地球物理学的観測データもグレースケールで表されます。
原則の紹介:
convert()メソッドは、画像の色変換を実現するために使用されます。PIL
のconvert( 'L')関数の原理は次のとおりです。
-
img = img.convert()
PILには、1、L、P、RGB、RGBA、CMYK、YCbCr、I、Fの9つの異なるモードがあります。 -
img.convert( '1')
は、黒または白のバイナリイメージです。各ピクセルは8ビットで表され、0は黒を意味し、255は白を意味します。 -
img.convert( 'L')#次のコードで使用されているコードは
グレースケール画像です。各ピクセルは8ビットで表され、0は黒、255は白、その他の数値は異なるグレーレベルを表します。
変換式:L = R * 299/1000 + G * 587/1000 + B * 114/1000。
コード表示:
# -*- codeing =utf-8 -*-
# @Time : 2021/3/7 15:16
# @Author : ArLin
# @File : demo1灰度图.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
figure()
pil_im = Image.open('data/001.jpg')
gray()# 不使用颜色信息
subplot(121)
title(u'原图',fontproperties=font)
axis('off')
imshow(pil_im)
pil_im = Image.open('data/001.jpg').convert('L')
subplot(122)
title(u'灰度图',fontproperties=font)
axis('off')
imshow(pil_im)
show()
結果の表示:
画像の輪郭とヒストグラム
画像の概要:
アウトラインは、オブジェクトの基本的な形状を表す一連の接続されたポイントで構成される曲線です。エッジと比較すると、アウトラインは連続しており、エッジがすべて連続しているわけではありません。
輪郭を見つける操作は、一般に2値化された画像に使用されるため、通常、しきい値セグメンテーションまたはキャニーエッジ検出を使用して、2値化された画像を最初に取得します。
ヒストグラム:
ヒストグラムは、画像全体のグレースケール分布を全体的に把握できるイラストであり、ヒストグラムを通じて、画像のコントラスト、明るさ、グレースケール分布を直感的に理解することができます。
画像のヒストグラムは、画像のピクセル値の分布を特徴づけるために使用されます。特定の数のビンは、特徴的なピクセル値の範囲を指定するために使用され、各ビンは、ビンの範囲に含まれるピクセルの数を取得します。
原則の紹介:
1.輪郭の描画:輪郭の
描画には、各座標[x、y]のピクセル値のしきい値を設定する必要があるため、最初に画像をグレー表示する必要があります。
2.ヒストグラムを
描画します。Matplotlibに付属の描画ツールplt.hist()を使用して描画します。
コード表示:
# -*- codeing =utf-8 -*-
# @Time : 2021/3/8 15:09
# @Author : ArLin
# @File : demo4图像轮廓和直方图.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"d:\JsVison\font\SimSun.ttc", size=14)
im = array(Image.open('data/001.jpg').convert('L')) # 打开图像,并转成灰度图像,读取图像到数组中
#图像轮廓
figure()
subplot(121)
gray()# 不使用颜色信息
contour(im, origin='image')# 在原点的左上角显示轮廓图像
axis('equal')
axis('off')
title(u'图像轮廓', fontproperties=font)
#图像直方图
subplot(122)
hist(im.flatten(), 128)
title(u'图像直方图', fontproperties=font)
plt.xlim([0,260])
plt.ylim([0,11000])
show()
結果のデモンストレーション:
2.ヒストグラム均等化
通常、良好な画像はヒストグラム上に均等に分散され、ヒストグラム均等化は画像の全体的な明るさとコントラストを改善するために使用されます。
ヒストグラム均等化とは、画像のグレースケールヒストグラムを平坦化して、変換された画像の各グレースケール値の分布確率が同じになるようにすることです。画像をさらに処理する前に、ヒストグラム均等化は通常、画像のグレー値を正規化するための非常に優れた方法であり、画像のコントラストを高めることができます。
ヒストグラム均等化の変換関数は、画像内のピクセル値の累積分布関数です(累積分布関数、cdfと略され、ピクセル値の範囲をターゲット範囲にマッピングする正規化操作)。
ヒストグラム均等化の具体的な実現(imtoolsの関数):
この関数には2つの入力パラメーターがあります。1つはグレー画像で、もう1つはヒストグラムで使用されるセルの数です。
この関数は、ヒストグラム均等化された画像と、ピクセル値のマッピングに使用される累積分布関数を返します。
累積分布関数の最後の要素(添え字-1)は、0 ... 1の範囲に正規化するために関数で使用されることに注意してください。
def histeq(im,nbr_bins=256):
""" 对一幅灰度图像进行直方图均衡化"""
# 计算图像的直方图
imhist,bins = histogram(im.flatten(),nbr_bins,normed=True)
cdf = imhist.cumsum() # cumulative distribution function
cdf = 255 * cdf / cdf[-1] # 归一化
# 使用累积分布函数的线性插值,计算新的像素值
im2 = interp(im.flatten(),bins[:-1],cdf)
return im2.reshape(im.shape), cdf
コード表示:
# -*- codeing =utf-8 -*-
# @Time : 2021/3/8 15:17
# @Author : ArLin
# @File : demo8直方图均衡化.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from PCV.tools import imtools
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"d:\JsVison\font\SimSun.ttc", size=14)
im = array(Image.open('data/001.jpg').convert('L')) # 打开图像,并转成灰度图像
im2, cdf = imtools.histeq(im) #上述详解imtools.histeq函数
figure()
subplot(2, 2, 1)
axis('off')
gray()
title(u'原始图像', fontproperties=font)
imshow(im)
subplot(2, 2, 2)
axis('off')
title(u'直方图均衡化后的图像', fontproperties=font)
imshow(im2)
subplot(2, 2, 3)
axis('off')
title(u'原始直方图', fontproperties=font)
hist(im.flatten(), 128, density=True)
subplot(2, 2, 4)
axis('off')
title(u'均衡化后的直方图', fontproperties=font)
hist(im2.flatten(), 128, density=True)
show()
結果の表示:
図に示すように、ヒストグラム均等化後に画像のコントラストが強調され、元の画像の灰色の領域の詳細が明確になります。
発生した問題:
学習Pythonコンピュータービジョンプログラミングを使用して本の過程で示されているソースコードにエラーがあります
。VisibleDeprecationWarning:normed=True
不均一なビンの受け渡しは常に壊れており、確率密度関数も確率質量関数も計算しません。結果は、ビンが均一である場合にのみ正しく、density = Trueの場合、とにかく同じ結果が生成されます。引数は、numpyの将来のバージョンで削除されます
。hist、_ = np.histogram(lbp、normed = True、bins = max_bins 、range =(0、max_bins))
解決策:標準を密度に置き換える
キーワードnormedは、混乱やバグの動作を引き起こす可能性があるため、Numpy1.6では非推奨になっています。Numpy2.0で削除されます。代わりに、densityキーワードを使用して置き換えます。
3、ガウスフィルタリング
ガウスフィルタリングは線形平滑化フィルターであり、ガウスノイズの除去に適しており、画像処理のノイズ除去プロセスで広く使用されています。
素人の言葉で言えば、ガウスフィルタリングは、画像全体を加重平均するプロセスです。各ピクセルの値は、それ自体と近隣の他のピクセル値の加重平均によって取得されます。
原則の紹介:
ガウスフィルタリングの特定の操作は、テンプレート(または畳み込み、マスク)を使用して画像内の各ピクセルをスキャンし、テンプレートによって決定された近傍のピクセルの加重平均グレー値を使用して、の中央ピクセルの値を置き換えることです。テンプレート。
フィルタリングは、入力信号の畳み込み処理のプロセスであり、次のような関数の形式で記述されます。
フィルター=畳み込み(入力信号、畳み込みテンプレート)畳み込みテンプレート/マスクの違いにより、さまざまなフィルタリング方法が決まります。ハイパス、ローパス、バンドパス、バンドストップなどの基本的なフィルタリング方法が生成されます。
ローパスフィルタリングの場合、信号の低周波数部分は予約され、高周波数部分は抑制されます。この目標を達成するために、平均マスク、ガウスマスクなどを使用して入力信号を処理できます。
平均マスクを使用して入力信号を畳み込むフィルタリング方法は平均フィルタリングと呼ばれ
、ガウスマスクを使用して入力信号を畳み込むフィルタリング方法はガウスフィルタリングと呼ばれます。
ガウスフィルタリングとガウスぼかし:
同じ。修飾子「Gauss」がない場合、フィルタリングの範囲はぼかしよりもはるかに大きく、後者は前者のサブセットにすぎません。「ガウス」制限が追加されると、参照される畳み込み演算は同じ演算になります。これは、式フィルタリング=畳み込み(入力信号、畳み込みテンプレート)によれば、2つの演算の入力信号と畳み込みテンプレートの両方が同時に、これら2つの操作は1つの操作です。
これは、フィルタリング効果が画像をぼかすように見えるため、再び「ガウスぼかし」と呼ばれます。
SciPy(http://scipy.org/)は、NumPyに基づく数値演算用のオープンソースツールキットです。SciPyは、数値積分、最適化、統計、信号処理、および私たちにとって最も重要な画像処理機能を実現できる多くの効率的な操作を提供します。次に、このセクションでは、SciPyの多数の便利なモジュールを紹介します。SciPyはオープンソースのツールキットであり、http://scipy.org/Downloadからダウンロードできます。
コード表示:
# -*- codeing =utf-8 -*-
# @Time : 2021/3/8 15:29
# @Author : ArLin
# @File : demo10高斯模糊.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from scipy.ndimage import filters
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"d:\JsVison\font\SimSun.ttc", size=14)
#im = array(Image.open('board.jpeg'))
im = array(Image.open('data/004.jpg').convert('L'))
figure()
gray()
axis('off')
subplot(1, 4, 1)
axis('off')
title(u'原图', fontproperties=font)
imshow(im)
for bi, blur in enumerate([2, 5, 10]):
im2 = zeros(im.shape)
im2 = filters.gaussian_filter(im, blur)
im2 = np.uint8(im2)
imNum=str(blur)
subplot(1, 4, 2 + bi)
axis('off')
title(u'标准差为'+imNum, fontproperties=font)
imshow(im2)
#如果是彩色图像,则分别对三个通道进行模糊
#for bi, blur in enumerate([2, 5, 10]):
# im2 = zeros(im.shape)
# for i in range(3):
# im2[:, :, i] = filters.gaussian_filter(im[:, :, i], blur)
# im2 = np.uint8(im2)
# subplot(1, 4, 2 + bi)
# axis('off')
# imshow(im2)
show()
結果の表示:
この画像は、σが増加するにつれて画像がぼやける程度を示しています。σが大きいほど、処理された画像の詳細が失われます。