2013-01-20 53 views
3

我想將此RGB代碼轉換爲灰度轉換器,而無需任何內置Open-CV功能。這就是我的代碼看起來像打開簡歷 - Python 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

當您創建matrix陣列np.zeros它,默認情況下,分配dtype=float。因此,即使您將值轉換並轉換爲int,但在將它們寫入matrix時,它們的存儲格式爲float s。如果讀the docs for cv.imshow你會發現以下:

  • 如果圖像是32位浮點,像素值是 乘以255即,值範圍[0,1]是映射到 [0,255]。

因此,圖像中的所有東西都乘以255,從而搞亂了最終結果。

你可以做兩件事情:

  1. 有一個浮點matrix,跳過所有的舍入,並通過255
  2. 將您的價值觀明確你的matrixdtype='uint8'創建和放下一切不變。

還有一個事實是,你對numpy的功能使用很差。上面給出的兩個選項,您可以編碼,無循環或矩陣分配,因爲

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 
+0

非常感謝。有這個事情困擾我很長一段時間,並不知道在哪裏可以找到解決方案。 – Manoj

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) 
+0

仍然無法正常工作。這是給你的嗎? – Manoj

+0

我不使用Python。在將值放入矩陣[i] [j]之前,嘗試轉換爲uchar。 –