You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用plt.imshow()转换RGB数组为图像时出现形状错误

Python油画滤镜:RGB数组转图像的形状与颜色异常问题

我尝试用Python实现油画效果滤镜,滤镜逻辑本身似乎能正常运行,但在将RGB数组转换为图像时遇到了两个问题:

  1. 形状错误,预期形状应为(333,500)
  2. 颜色异常,输出图像偏蓝

我曾尝试用PIL的Image.fromarray()转换,但同样失败。

from skimage import io
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal
from PIL import Image
from PIL import Image
from PIL import ImageFilter

plt.figure("hist",figsize=(8,8))

img_4_1=io.imread("img_2.jpg")
arr_4_1=img_4_1.flatten()
arr_4_1=arr_4_1.reshape(333,500,3)*255
arr_4_1.flags["WRITEABLE"]=False
arr_4_2=np.copy(arr_4_1)
arr_4_2.flags["WRITEABLE"]=True
intensity=10
radius=2
check_intensity=np.zeros((intensity+1)*4).reshape((intensity+1),4)

for x in range(2,arr_4_1.shape[0]-2):
    for y in range(2,arr_4_1.shape[1]-2):
        for i in range(-radius,radius+1):
            for j in range(-radius,radius+1):
                temp_r=int(arr_4_1[x+i][y+j][0])
                temp_g=int(arr_4_1[x+i][y+j][1])
                temp_b=int(arr_4_1[x+i][y+j][2])
                temp=(((temp_r+temp_g+temp_b)/3)*intensity)/255
                if temp>intensity:
                    temp=intensity
                check_intensity[int(temp)][0]+=1
                check_intensity[int(temp)][1]+=temp_r
                check_intensity[int(temp)][2]+=temp_g
                check_intensity[int(temp)][3]+=temp_b
        max_intensity=0
        for h in range(1,intensity):
            if check_intensity[h][0]-check_intensity[h-1][0]>0:
                max_intensity=h
        final_r=round(check_intensity[max_intensity][1]/check_intensity[max_intensity][0])
        final_g=round(check_intensity[max_intensity][2]/check_intensity[max_intensity][0])
        final_b=round(check_intensity[max_intensity][3]/check_intensity[max_intensity][0])
        if final_r>255:
            final_r=255
        if final_g>255:
            final_g=255
        if final_b>255:
            final_b=255
        for k in range(-radius,radius+1):
            for l in range(-radius,radius+1):
                arr_4_2[x+k][y+l][0]=final_r
                arr_4_2[x+k][y+l][1]=final_g
                arr_4_2[x+k][y+l][2]=final_b
        check_intensity=np.zeros((intensity+1)*4).reshape((intensity+1),4)
        
plt.figure("hist",figsize=(8,8))
plt.subplot(221)
plt.axis('off')
plt.imshow(arr_4_1) # original picture
plt.subplot(222)
ar_4_1=arr_4_1[:,:,0].flatten()
plt.hist(ar_4_1, bins=256, density=True, facecolor='r',edgecolor='r')
ag_4_1=arr_4_1[:,:,1].flatten()
plt.hist(ag_4_1, bins=256, density=True, facecolor='g',edgecolor='g')
ab_4_1=arr_4_1[:,:,2].flatten()
plt.hist(ab_4_1, bins=256, density=True, facecolor='b',edgecolor='b')
plt.xlim(0,255)
plt.subplot(223)
plt.axis('off')
plt.imshow(arr_4_2) # oil painting effects
plt.subplot(224)
ar_4_2=arr_4_2[:,:,0].flatten()
plt.hist(ar_4_2, bins=256, density=True, facecolor='r',edgecolor='r')
ag_4_2=arr_4_2[:,:,1].flatten()
plt.hist(ag_4_2, bins=256, density=True, facecolor='g',edgecolor='g')
ab_4_2=arr_4_2[:,:,2].flatten()
plt.hist(ab_4_2, bins=256, density=True, facecolor='b',edgecolor='b')
plt.xlim(0,255)

关键步骤

  • 将展平后的数组转换为3D数组
  • 使用np.copy创建arr_4_2
  • 修改arr_4_2中的元素,保持arr_4_1不变
  • 尝试将数组重新转换为图像,但失败

失败点

  1. 形状错误,预期形状应为(333,500)
  2. 颜色异常,输出图像偏蓝

我主要想修复形状问题,如果能解决颜色问题就更好了。

内容的提问来源于stack exchange,提问作者marycheung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:20:37