3

組み込みの Open-CV 関数を使用せずに、この RGB からグレースケールへのコンバーターをコーディングしたかったのです。これは私のコードがどのように見えるかです

import cv2 , numpy
def GrayConvertor(img):


    rows , cols , layers = img.shape

    matrix = numpy.zeros((rows , cols))

    for i in range(rows):
        for j in range(cols):
            val = 0.114 * (img[i][j][0]) + 0.587 * (img[i][j][1]) + 0.299 * (img[i][j][2])
            fraction = val - int(val)
            if fraction >= 0.5:
                matrix[i][j] = (int(val) + 1) 

            else: 
                matrix[i][j] = int(val) 
    cv2.imshow("gray" , matrix)
    cv2.waitKey(0)

ただし、空白の画像が表示されます。何かアイデアはありますか?

4

2 に答える 2

5

matrixそれを使用して配列を作成するnp.zerosと、デフォルトでが割り当てられdtype=floatます。したがって、値を丸めてに変換しても、値をint書き込むと、smatrixとして格納されfloatます。ドキュメントcv.imshowを読むと、次のことがわかります。

  • 画像が32ビット浮動小数点の場合、ピクセル値は255で乗算されます。つまり、値の範囲[0,1]は[0,255]にマップされます。

したがって、画像内のすべてが255倍になり、最終結果が台無しになります。

あなたは2つのことをすることができます:

  1. 浮動小数点をmatrix使用し、すべての丸めをスキップして、値を255で除算します。
  2. 明示的にmatrixwithdtype='uint8'を作成し、すべてを変更しないでください。

numpyの機能を非常にうまく利用していないという事実もあります。上で示した2つのオプションは、ループや行列の割り当てなしでコーディングできます。

rgb2k = np.array([0.114, 0.587, 0.299])
matrix_int = np.round(np.sum(img * rgb2k, axis=-1)).astype('uint8')
matrix_float = np.sum(img * rgb2k, axis=-1) / 255
于 2013-01-20T09:06:07.190 に答える
0

試す:

import cv2 , numpy
def GrayConvertor(img):


    rows , cols , layers = img.shape

    matrix = numpy.zeros((rows , cols))

    for i in range(rows):
        for j in range(cols):
            val = 0.114 * (img[i][j][0]) + 0.587 * (img[i][j][1]) + 0.299 * (img[i][j][2])
                matrix[i][j] = round(val) 
    cv2.imshow("gray" , matrix)
    cv2.waitKey(0)
于 2013-01-20T08:51:03.893 に答える