我想将此RGB编码为灰度转换器,而无需任何内置的Open-CV功能。这就是我的代码的样子
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)
然而它显示一个空白图像,任何想法?
答案 0 :(得分:4)
使用matrix
创建np.zeros
数组时,默认情况下会为其分配dtype=float
。因此,即使您将值转换为int
并将其转换为matrix
,也会将其存储为float
。如果您阅读the docs for cv.imshow
,您会发现以下内容:
- 如果图像是32位浮点,则像素值为 乘以255.也就是说,值范围[0,1]被映射到 [0255]。
因此,图像中的所有内容都会乘以255,从而弄乱您的最终结果。
你可以做两件事:
matrix
,跳过所有舍入,并将值除以255。matrix
明确创建dtype='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
答案 1 :(得分: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)