opencvの学習3:numpy配列操作

1.カラーチャンネルを変更した後、画像を読み取って出力します

行数、列数、チャンネル数の行列で画像を取得できます。行列を操作することで画像のピクセル数を変更できます。
コードは次のとおりです。

import cv2 as cv  #导入cv模块
import numpy as np #np科学计数的包,通过numpy对数据进行处理

def access_pixels(image):
    print(image.shape)
    height = image.shape[0] #图像的第一维度 高度
    width = image.shape[1] #图像的第二维度 宽度
    channels = image.shape[2] #图像的第三维度 通道数目
    print("width : %s,height : %s,channels : %s" % (width, height, channels))
    for row in range(height):
        for col in range(width):
            for c in range (channels):
                pv = image[row, col, c]
                image[row, col, c] = 255 - pv
    cv.imshow("pixels_demo", image)
    
src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/lena.jpg")  #读取图片位置
#blue green red
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)  #创建一个GUI
cv.imshow("input image", src) #对窗口图片进行展示
t1 = cv.getTickCount()
access_pixels(src)
t2 = cv.getTickCount()
time = (t2 - t1)*1000/cv.getTickFrequency()
print("time : %s" % time)
cv.waitKey(0)
cv.destroyAllWindows()  #释放所有的内存

実行中のスクリーンショット:
ここに画像の説明を挿入cv :: getTickCount()を使用して、コードの実行時間を測定できます。この関数は、最後の起動からのクロックサイクル数を返します。

必要なのは特定のコードセグメントが実行されるミリ秒数であるため、別の関数cv :: getTickFrequency()も必要です。この関数は、1秒あたりのクロックサイクル数を返します。

2.マルチチャンネル画像をカスタマイズします

使用される関数:0と1の
コードは次のとおりです。

import cv2 as cv
import numpy as np
 
 
def create_image():
    img = np.zeros([400, 400, 3], np.uint8)#zeros:double类零矩阵  创建400*400 3个通道的矩阵图像 参数时classname为uint8
    img[:, :, 0] = np.ones([400, 400])*255#ones([400, 400])是创建一个400*400的全1矩阵,*255即是全255矩阵 并将这个矩阵的值赋给img的第一维
    img[:, :, 1] = np.ones([400, 400])*255#第二维全是255
    img[:, :, 2] = np.ones([400, 400])*255#第三维全是255
    cv.imshow("new image", img)#输出一张400*400的白色图片(255 255 255):蓝(B)、绿(G)、红(R)
 
create_image()
cv.waitKey(0)
cv.destroyAllWindows()

操作の結果、白い画像が出力されます。255を他の数値に変更して、異なる色の画像を出力
することもできます。ones関数を個別に使用することもできます。コードは次のとおりです。


import cv2 as cv
import numpy as np
 
 
def create_image():
    img = np.ones([400, 400, 3], np.uint8)
    img[:, :, 0] = img[:, :, 0]*255
    img[:, :, 1] = img[:, :, 1]*255
    img[:, :, 2] = img[:, :, 2]*255
    cv.imshow("new image", img)
 
create_image()
cv.waitKey(0)
cv.destroyAllWindows()

2:シングルチャンネル画像をカスタマイズする

# -*- coding=GBK -*-
import cv2 as cv
import numpy as np
 
 
def create_image():
    img = np.ones([400, 400, 1], np.uint8)#该像素点只有一个通道,该函数使所有像素点的通道的灰度值为1
    img = img * 127 #使每个像素点单通道的灰度值变为127,0到255都可以,颜色由黑(0)转灰(127)转白(255)
    cv.imshow("new image", img)
 
create_image()
cv.waitKey(0)
cv.destroyAllWindows()

注意:

1.コードのimg = img * 127は、配列の各値に127を掛けることを意味します

2. np.ones関数のパラメータタイプがuint8である理由は、uint8番号の範囲が0〜255であるため、0の場合は真っ黒、255の場合は白になります。関数パラメータタイプがint8の場合、int8タイプ番号の範囲は-128〜127であり、-128は黒、127は白です。

reshape()メソッドを使用する場合

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

3つ目は、ライブラリ関数を呼び出してピクセル反転を実現することです。

# -*- coding=GBK -*-
import cv2 as cv
import numpy as np
 
 
#像素取反
def inverse(image):
    dst = cv.bitwise_not(image)
    cv.imshow("取反", dst)
 
 
src = cv.imread("C://1.jpg")
cv.namedWindow("原来", cv.WINDOW_NORMAL)
cv.imshow("原来", src)
t1 = cv.getTickCount()
inverse(src)
t2 = cv.getTickCount()
time = (t2 - t1)*1000/cv.getTickFrequency()
print("time: %s" % time)
cv.waitKey(0)
cv.destroyAllWindows()

bitwise_not関数の呼び出しは非常に高速に実行されます!

おすすめ

転載: blog.csdn.net/weixin_44145452/article/details/112411853
おすすめ