我正在处理一个图像(2192 x 2921 x 3),将等于0的像素值替换为它以前的非零值。
代码完成时没有出现错误,但输出图像不再是RGB。
我的代码中有什么错误导致了这个吗?
函数“fill_zeros_with_last
“来自StackOverflow。
代码如下:
import numpy as np
import cv2
from PIL import Image
def fill_zeros_with_last(arr):
prev = np.arange(len(arr))
prev[arr == 0] = 0
prev = np.maximum.accumulate(prev)
return arr[prev]
image = cv2.imread('path\to\image')
image_modified = [] # to store the processed image
for k in range(3):
for j in range(2921):
image1 = fill_zeros_with_last(image[:, j, k]) # replaces 0s with the previous nonzero value.
image_modified.append(image1)
image_modified = np.reshape(image_modified, ((2192, 2921, 3))) # to reshape the image
image_modified = image_modified.astype('uint8') # convert to uint8
img1 = Image.fromarray(image_modified, 'RGB') # convert to RGB
img1.save('image_modified.png') # save image
下面是一个输入图像示例:
示例输出:
1条答案
按热度按时间8ulbf1ek1#
看起来您对存储OpenCV图像的NumPy数组的数据排序感到困惑。
OpenCV中图像的自然排序(在内存中)是“原始主要”,即
b
、g
、r
、b
、g
、r
......数据排序:image
数组的索引为:image[r, c, ch]
(行、列、颜色通道):image_modified
是已修改列的列表,列表中的每个元素应用一个颜色通道:为了固定顺序,我们可以应用
np.reshape
,然后应用np.transpose
:3
列<cols
><rows
>:cols
和3
转置(置换)到rows
:代码示例:
我们可以使用NumPy数组来存储
image_modified
,而不是使用列表,而不是打乱顺序:输出量: