前回のチュートリアルでは、マウスペンを使用する機能を紹介しました。このチュートリアルでは、OpenCV画像処理の基本的な操作について説明します。
このチュートリアルで紹介する必要があるのは:
・画像のピクセル値を表示して変更する
・画像のプロパティを
表示する・関心領域(ROI)を表示する・画像を
分割してマージする
このチュートリアルのすべての操作は、基本的にはOpenCVではなくNumpyに関連しています。OpenCVを使用してより最適化されたコードを作成するには、Numpyに関する豊富な知識が必要です。
ピクセル値を表示および変更する
画像内の特定のピクセルのピクセル値を表示する場合は、まずその座標を特定して調整する必要があります。まずカラー画像を見てみましょう(まだ猫ですが、このチュートリアルは主人公です):
特定の座標のピクセル値を表示したいので、コードをpycharmに入力します。
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("cat.jpg")
#获取像素值
px = img[200,200]
print(px)
コードは画像座標(200、200)のピクセル値を表示することです。結果を見てみましょう。
前のチュートリアルでは、OpenCVがRGBチャネルからではなくBGRチャネルから画像を読み取ることについて説明しました。次に、プログラム出力[178、189、186]がBGRピクセルに対応していることを確認します。
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("cat.jpg")
#获取像素值
px = img[200,200]
B = img[200,200,0]
G = img[200,200,1]
R = img[200,200,2]
print(px,B,G,R)
画像がカラーではなく、白黒のグレースケール画像である場合、どのように出力されると思いますか?最初の実験:
今でもコードを使用して実験します(ただし、画像がグレースケール化されている場合は、これについては後で説明し
ます)。効果:BGRのピクセルが同じであることがわかり、結論が得られます:グレースケール画像では、出力ピクセル値は基本的にその輝度強度値であり、値の範囲は0〜255で、0の場合はすべて黒、それ以外の場合は白です。
次に、ピクセル値を変更して、指定した座標のピクセル値を配列に割り当てます。
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("cat1.jpg")
#获取像素值
px = img[200,200]
print(px)
img[200,200] = [225,225,225]
print(img[200,200])
出力を表示します。
ご覧のように、初期ピクセル値の後に変更されたピクセル値が続きます。
一般的に言えば、配列は通常、最初の数行または最後の数列など、特定の領域を選択します。特定のピクセルにアクセスするには、Numpy配列メソッド、array.item()およびarray.itemset()の方が効果的です。しかし、それはスカラーを返します。したがって、B、G、Rのすべての値にアクセスする場合は、array.item()を個別に呼び出す必要があります。コードを見てみましょう(まだ例として座標200、200を使用しています)。
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("cat.jpg")
#获取像素值
px = img[200,200]
print(px)
print(img.item(200,200,0))
itemを使用して、青色のピクセルの値であるピクセルのB値を出力します。
実験は効果が以前と同じであることを示しています。
指定した座標の割り当てには、itemset関数を使用して特定のピクセルに正確にすることができます。たとえば、今度は青のピクセルの値のみを変更します。
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("cat.jpg")
#获取像素值
px = img[200,200]
print(px)
print(img.item(200,200,0))
img.itemset((200,200,0),100)
print(img.item(200,200,0))
指定されたカラーチャンネルの割り当てが完全に可能であることがわかります。
画像のプロパティを表示する
ここでは、画像のさまざまな属性について説明します。画像の属性には、行、列、チャネルの数、画像データのタイプ、ピクセル数などが含まれます。
画像の場合、shapeを使用して行、列、およびカラーチャネルの数を返します。
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("cat.jpg")
print(img.shape)
出力の3番目の値は、画像のBGRの3つのチャネルの要素番号(3)を表します。ここで、グレースケールイメージを試します。
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("cat.jpg")
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(img.shape)
グレースケール画像については、後のチュートリアルで説明します。ここでは実験として使用し
ます。画像がグレースケールの場合、返されるタプルには行と列の数しか含まれていないことがわかります。これは、読み込まれた画像がグレースケールも色の良い方法です。
現在の画像のピクセルの総数は、サイズによって返されます。
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("cat.jpg")
print(img.size)
画像のデータ型は、dtypeを通じて取得できます。
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("cat.jpg")
print(img.dtype)
画像を読み取るためのimread関数の既定の形式はuint8であるため、返されるすべての形式はこの形式です。将来、ディープラーニングフレームワークを学習するときに、uint8の画像データ形式をモデルのトレーニングに使用すると、データの正規化(前処理段階)によって精度が失われ、最終的にセグメンテーションの精度が低下することがわかります。もちろん、これは後で説明します。ここでは触れません。
画像の形式を変更する場合は、astype関数を使用して、画像をfloat32形式に変更する必要があります(この形式の画像は、深層学習モデルのトレーニングで広く使用されています)。
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("cat.jpg").astype(np.float32)
print(img.dtype)
OpenCV-Pythonコードの多数のエラーは無効なデータ型が原因で発生するため、dtypeはデバッグ時に非常に重要であり、今後の学習でこれらの問題に遭遇することがよくあります。
画像のROI
画像内の特定の領域の選択はROIと呼ばれ、実際には画像のxy座標に対する操作です。例を見てみましょう:
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("cat.jpg")
husky = img[1:240,60:270]
cv2.imshow("img",husky)
cv2.waitKey(0)
cv2.destroyAllWindows()
エッセンスは、画像の特定の部分をインターセプトすることに相当します。次に、インターセプトされた部分を画像の他の部分にカバーする興味深い操作を実行してみましょう。エッセンスは、上記のピクセル変更に相当します。
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("cat.jpg")
husky = img[1:240,60:270]
img[61:300,270:480] = husky
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像チャネルの分割とマージ
時には、B、G、Rチャンネルの画像を個別に操作する必要があります。この場合、BGRイメージを単一のチャネルに分割する必要があります。スプリット関数とマージ関数を使用する必要があります。それらの関数はそれぞれ分離とマージです。
b、g、r = cv2.split(img)#Split画像チャネル
img = cv2.merge((b、g、r))
この操作では、3つのBGRチャネルを分離できるため、特定のチャネルを操作できます。たとえば、ここですべてのRピクセルを0に設定します。
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("cat.jpg")
b,g,r = cv2.split(img) #拆分图像通道
img[:,:,2] = 0
r = img[:,:,2]
img = cv2.merge((b,g,r))
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
rはRチャネルです。効果を確認してください。
赤のチャンネルを削除した後、私たちの猫は少し緑になりました。もちろん、他のチャネルを試すこともできます。
画像枠塗りつぶし
画像(フォトフレームなど)の周囲に境界線を作成する場合は、関数cv2.copyMakeBorder()を使用できます。畳み込み演算(非常に重要)、ゼロパディングなどでより多くのアプリケーションがあります。この関数は次のパラメーターを取ります。
cv2.copyMakeBorder(src、top、bottom、left、right、borderType [、dst [、value]])
・Src入力画像
・上、下、左、右-対応する方向の境界線の幅(ピクセル単位)
・値:cv2.BORDER_CONSTANT、cv2.BORDER_REFLECT、cv2.BORDER_REFLECT_101またはcv2.BORDER_DEFAULT、cv2.BORDER_REPLICATE、cv2.BORDER_WRAP
cv2.BORDER_defLECT_101またはcv2.BORDER_DEFAgが上記と同じように変更され、同じように変更されます| gfedcba
cv.BORDER_REPLICATE-最後のピクセルは、次のようにプロセス全体にコピーされます:aaaaaa | abcdefgh | hhhhhhh
cv.BORDER_WRAP対称方向のピクセルスワップは次のようになります:cdefgh | abcdefgh | abcdefgこのような。
コードを見てみましょう:
view plaincopy to clipboardprint?
import cv2
from matplotlib import pyplot as plt
BLUE = [255,0,0]
img1 = cv2.imread('cat.jpg')
replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()
実験的効果:
5つのパラメーターすべての実験では明らかな違いが見られます。もちろん、画像の比較と表示を容易にするために、matplotlibライブラリを使用しますが、これはpythonの知識に属するため、ここでは紹介しません。コードを変更し、OpenCVを使用して他のパラメーターを出力することもできます。
記事の概要ページを表示https://blog.csdn.net/weixin_44237705/article/details/107864965
グループ内でより多くのopenvino技術情報を交換できます〜