OpenCVインストール、画像処理

テスト環境

ライブラリをインストールする

OpenCVを使用してPythonに関するいくつかのライブラリをインストールする必要があります

  • opencv-python
  • opencv-contrib-python
  • pytesseract

次に、通常のインストール方法は、cmdコマンドラインにpipインストールライブラリ名を入力することです
が、ダウンロード速度が非常に遅いため、ミラーを使用して
python -m pip をダウンロードする必要があります

python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 库名

すべてをcmdにコピーし、ライブラリ名を選択したライブラリに変更して、ダウンロードします

テスト環境

import cv2 as cv

src = cv.imread("C:/Users/acer/Desktop/Other/img/01.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
cv.waitKey(0)
cv.destroyAllWindows()

ここで注意すべき点が2つあり
ます。1.最初にcv2ライブラリをインポートしてください。2
. cv.imreadでマシンの写真のアドレスを読み取り、\の代わりに/を使用します。

この時点で、[実行]をクリックすると画像が表示されます。これは、環境が正常に構築されたことを意味します

中国語のコメントが間違っている場合は、上部に追加してください # coding:utf-8

全体像を把握

# coding:utf-8
import cv2 as cv

src = cv.imread("01.jpg")
src2 = cv.imread("01.jpg",cv.IMREAD_GRAYSCALE)#读取灰度图像
cv.imshow("image",src) #给窗口指定一个名字
cv.waitKey(0) #等待时间,毫秒,0表示任意键终止
cv.destroyAllWindows() #触发关闭操作,关闭窗口
  • コーディング:utf-8:エンコード形式をutf-8に設定します
  • cv2をcvとしてインポートします。opencvライブラリをcvと名付けました。
  • cv.imreadで画像を読んでください。この画像は私のプロジェクトにあるので、別の場所に完全なパスを書く場合は、名前を書いてください。
  • cv.imread( "01.jpg"、cv.IMREAD_GRAYSCALE)背後のパラメータは、グレースケールイメージを読み取るように設定することです
  • imshowの最初のパラメーターは名前、2番目のパラメーターは画像です
  • 待機キー待機時間
  • ウィンドウを閉じるためのdestroyAlliwindows操作

shapeは、opencvの画像の行、列、カラーチャネルの数を画像座標で表すことができます。


写真を撮る

src = cv.imread("01.jpg")
demo = src[0:50,0:200]
cv.imshow("image",demo) #给窗口指定一个名字
cv.waitKey(0) #等待时间,毫秒,0表示任意键终止
cv.destroyAllWindows() #触发关闭操作,关闭窗口
  • imreadで写真を読む
  • 画像名順[0:50,0:200]高さ50幅200
  • 残りの操作は全体像と同様です

ビデオを読む

# coding:utf-8
import cv2 as cv

vc = cv.VideoCapture("test.mp4");
if vc.isOpened():
    open, frame = vc.read() # open 是布尔值,frame是当前这一帧的图像
else:
    open = False

while open: #如果open是true就是能打开 进入while循环
    ret, frame = vc.read() #读一下
    if frame is None: #如果这个帧为空,就是没有下一帧了,就结束
        break
    if ret == True: #读这一帧数没错误
        gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
        #转换成灰度图 frame:传递当前这一帧,COLOR_BGR2GRAY:生成灰度图

        cv.imshow('result',gray) #展示结果,名字result 传进来gray

        if cv.waitKey(10) & 0xFF == 27: #0xFF == 27 代表执行过程中按一个键就退出
            break
vc.release()
cv.destroyAllWindows()
  • cv.VideoCapture( "test.mp4")ビデオアドレスパスを取得
  • openはビデオを開くかどうかを表すブール値で、frameは現在のフレームの画像です
  • cv.cvtColor(フレーム、cv.COLOR_BGR2GRAY)グレースケール画像に変換、現在のフレームをフレーム、COLOR_BGR2GRAY:グレースケールを生成
  • 0xFF == 27は、実行中にキーを押して終了することを意味します

BGR

Rのみ

# coding:utf-8
import cv2 as cv

src = cv.imread("01.jpg")
cur_img = src.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv.imshow('R',cur_img)

cv.waitKey(0) #等待时间,毫秒,0表示任意键终止
cv.destroyAllWindows() #触发关闭操作,关闭窗口

R BGのみを0に保つようにBGRを設定する

image-20200421150812625

Gのみを保持

# coding:utf-8
import cv2 as cv

src = cv.imread("01.jpg")
cur_img = src.copy()
cur_img[:,:,0] = 0
cur_img[:,:,2] = 0
cv.imshow('G',cur_img)

cv.waitKey(0) #等待时间,毫秒,0表示任意键终止
cv.destroyAllWindows() #触发关闭操作,关闭窗口

BGRを設定することにより、G BRのみを0に保つ

image-20200421150913866

Bのみを保持

# coding:utf-8
import cv2 as cv

src = cv.imread("01.jpg")
cur_img = src.copy()
cur_img[:,:,1] = 0
cur_img[:,:,2] = 0
cv.imshow('B',cur_img)

cv.waitKey(0) #等待时间,毫秒,0表示任意键终止
cv.destroyAllWindows() #触发关闭操作,关闭窗口

B GRのみを0に保つようにBGRを設定する

image-20200421151012653

境界塗りつぶし

top_size,bottom_size,left_size,right_size = (50,50,50,50)

replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)

matplotによる描画

import matplotlib.pyplot as plt
plt.subplot(231), plt.imshow(img, '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()

image-20200421152730651

  • BORDER_REPLICATE:コピーメソッド、つまりエッジピクセルをコピーします。
  • BORDER_REFLECT:反射法、対象の画像の両側にあるピクセルをコピーします。例:fedcba | abcdefgh | hgfedcb
  • BORDER_REFLECT_101:反射率メソッド、つまり、エッジピクセルを軸とする対称性、gfedcb | abcdefgh | gfedcba
  • BORDER_WRAP:外側のパッケージ方法cdefgh | abcdefgh | abcdefg
  • BORDER_CONSTANT:定数メソッド、定数値充填。

数値計算

猫と犬、次に犬=猫+ 10を取得し、最終結果の最初の5行を取得します

img_cat=cv2.imread('cat.jpg')
img_dog=cv2.imread('dog.jpg')
img_cat2= img_cat +10 
img_cat[:5,:,0]

array([[142, 146, 151, ..., 156, 155, 154],
       [107, 112, 117, ..., 155, 154, 153],
       [108, 112, 118, ..., 154, 153, 152],
       [139, 143, 148, ..., 156, 155, 154],
       [153, 158, 163, ..., 160, 159, 158]], dtype=uint8)

この時点での猫2の値を表示

img_cat2[:5,:,0] #查看此时猫2的值

array([[152, 156, 161, ..., 166, 165, 164],
       [117, 122, 127, ..., 165, 164, 163],
       [118, 122, 128, ..., 164, 163, 162],
       [149, 153, 158, ..., 166, 165, 164],
       [163, 168, 173, ..., 170, 169, 168]], dtype=uint8)

Cat 1 + Cat 2は、142 + 152 = 294であり、最初の行は38です
。これは、unit8のビット数が0〜255であるため、残りを取得するために結果を256%にする必要があること、つまり294-255 = 38です。

#相当于% 256
(img_cat + img_cat2)[:5,:,0] 

array([[ 38,  46,  56, ...,  66,  64,  62],
       [224, 234, 244, ...,  64,  62,  60],
       [226, 234, 246, ...,  62,  60,  58],
       [ 32,  40,  50, ...,  66,  64,  62],
       [ 60,  70,  80, ...,  74,  72,  70]], dtype=uint8)

この追加を追加すると、境界を超えた後、%255ではなく%255が出力されます

cv2.add(img_cat,img_cat2)[:5,:,0]	

array([[255, 255, 255, ..., 255, 255, 255],
       [224, 234, 244, ..., 255, 255, 255],
       [226, 234, 246, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255]], dtype=uint8)

画像融合

直接追加した場合

img_cat + img_dog


ValueError: operands could not be broadcast together with shapes (414,500,3) (429,499,3) 

2つの値が同じではなく、それらを追加する方法がないというエラーが報告されます。

次に、サイズ変更操作を実行して同じにする必要があります。
サイズ変更を介して(画像オブジェクト、変更が必要な値)

img_dog = cv2.resize(img_dog, (500, 414))
img_dog.shape

(414, 500, 3)

addWeighted

res = cv2.addWeighted(img_cat, 0.4, img_dog, 0.6, 0)
plt.imshow(res)

image-20200421154354644

res = cv2.resize(img, (0, 0), fx=4, fy=4)
plt.imshow(res)

ここでは0、0を設定しますが、fxとfyで倍数を設定して変更します

image-20200421154438676

res = cv2.resize(img, (0, 0), fx=1, fy=3)
plt.imshow(res)

image-20200421154454242

画像のしきい値

ret, dst = cv2.threshold(src, thresh, maxval, type)
  • src:入力画像、単一チャネル画像のみ入力可能、通常はグレースケール画像
  • dst:出力グラフ
  • thresh:しきい値
  • maxval:ピクセル値がしきい値を超える場合(またはタイプによって決定されるしきい値未満の場合)、割り当てられた値
  • type:次の5つのタイプを含むバイナリ操作のタイプ:cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO; cv2.THRESH_TOZERO_INV
  • cv2.THRESH_BINARYはmaxval(最大値)を取るためのしきい値を超え、それ以外の場合は0をとります
  • cv2.THRESH_BINARY_INV THRESH_BINARYの反転
  • しきい値より大きいcv2.THRESH_TRUNCがしきい値として設定され、それ以外の場合は変更されません
  • しきい値より大きいcv2.THRESH_TOZEROは変更されません。それ以外の場合は0に設定されます。
  • cv2.THRESH_TOZERO_INV THRESH_TOZEROの反転
ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)

titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in range(6):
    plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

image-20200421155227547

画像の平滑化

img = cv2.imread('lenaNoise.png')

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 均值滤波
# 简单的平均卷积操作
blur = cv2.blur(img, (3, 3))

cv2.imshow('blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()


# 方框滤波
# 基本和均值一样,可以选择归一化
box = cv2.boxFilter(img,-1,(3,3), normalize=True)  

cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()


# 方框滤波
# 基本和均值一样,可以选择归一化,容易越界
box = cv2.boxFilter(img,-1,(3,3), normalize=False)  

cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()



# 高斯滤波
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
aussian = cv2.GaussianBlur(img, (5, 5), 1)  

cv2.imshow('aussian', aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()


# 中值滤波
# 相当于用中值代替
median = cv2.medianBlur(img, 5)  # 中值滤波

cv2.imshow('median', median)
cv2.waitKey(0)
cv2.destroyAllWindows()


# 展示所有的
res = np.hstack((blur,aussian,median))
#print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

おすすめ

転載: www.cnblogs.com/pengcode/p/12747408.html