首页 > 解决方案 > 增加彩色图像亮度时的索引数量不正确

问题描述

代码在读取灰度图像以执行亮度时工作正常。但是相同的代码不适用于彩色图像。如何从彩色图像执行亮度操作?

在参数 0 处使用 cv2.imread 读取图像时工作正常,但我尝试使用 1 它不起作用,因为 0 用于灰度图像,1 用于彩色图像。

import numpy as np
import cv2

img = cv2.imread('image1.jpg',1)

height = img.shape[0]
width = img.shape[1]
brightness = 100

for i in np.arange(height):
    for j in np.arange(width):
        a = img.item(i,j)
        b = a + brightness
        if b > 255:
            b = 255
        img.itemset((i,j), b)

cv2.imwrite('brightness.jpg', img)

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

我希望读取彩色图像并执行亮度操作,但它显示 ValueError: wrong number of indices for array

标签: pythonpython-3.xopencv

解决方案


一种解决方案是使用OpenCV 归一化将图像拉伸到全动态范围(0 到 255)。

以下是两个输出结果,具体取决于最小和最大拉伸限制。请注意,规范化适用于浮点数据,最小值和最大值名义上被拉伸到 0 到 1 的整个范围。但是我们需要将结果剪辑到这个范围,然后将它们缩放到 0 到 255 的范围,然后保存为 uint8 用于输出, 如果最小值和最大值超出 0 到 1 的范围。

The first result is stretched to min and max of 0 to 1.

The second result is stretched to min and max of 0 to 1.2 in order to make it even brighter.


图片:

在此处输入图像描述

#!/bin/python3.7

import cv2
import numpy as np

# read image
img = cv2.imread("zelda1_bm20_cm20.jpg", cv2.IMREAD_COLOR)

# normalize float versions
norm_img1 = cv2.normalize(img, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
norm_img2 = cv2.normalize(img, None, alpha=0, beta=1.2, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)

# scale to uint8
norm_img1 = (255*norm_img1).astype(np.uint8)
norm_img2 = np.clip(norm_img2, 0, 1)
norm_img2 = (255*norm_img2).astype(np.uint8)

# write normalized output images
cv2.imwrite("zelda1_bm20_cm20_normalize1.jpg",norm_img1)
cv2.imwrite("zelda1_bm20_cm20_normalize2.jpg",norm_img2)

# display input and both output images
cv2.imshow('original',img)
cv2.imshow('normalized1',norm_img1)
cv2.imshow('normalized2',norm_img2)
cv2.waitKey(0)
cv2.destroyAllWindows()


最小值和最大值(0 到 1):

在此处输入图像描述

最小值和最大值(0 到 1.2):

在此处输入图像描述


推荐阅读