使用plt.imshow()转换RGB数组为图像时出现形状错误
Python油画滤镜:RGB数组转图像的形状与颜色异常问题
我尝试用Python实现油画效果滤镜,滤镜逻辑本身似乎能正常运行,但在将RGB数组转换为图像时遇到了两个问题:
- 形状错误,预期形状应为(333,500)
- 颜色异常,输出图像偏蓝
我曾尝试用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不变 - 尝试将数组重新转换为图像,但失败
失败点
- 形状错误,预期形状应为(333,500)
- 颜色异常,输出图像偏蓝
我主要想修复形状问题,如果能解决颜色问题就更好了。
内容的提问来源于stack exchange,提问作者marycheung
相关产品推荐
相关产品推荐

