垂直滤镜脚本改写为函数后无法生成正确图像,求修正方案
垂直滤镜脚本转函数后失效问题求助
我编写了一个名为"垂直滤镜"的脚本,用于检测图像的垂直区域,区分水平区域并生成黑白分割的新图像。该脚本可输出预期的黑白结果图,但将其改写为函数后无法正常工作,返回的仍是原图像。以下是原脚本、改写后的函数代码:
原脚本
import numpy as np from skimage import data, io import matplotlib.pyplot as plt import matplotlib !pip install scikit-image img = io.imread('data/earth.jpg') verical_filter =[[-1,-2,-1],[0,0,0],[1,2,1]] n,m,d= img.shape # 获取图像的尺寸 # 应用垂直滤镜 vertical_edges_img = np.zeros_like(img) for row in range(3, n-2): # 遍历每个像素 for col in range(3, m-2): local_pixels = img[row-1:row+2,col-1:col+2,1] transformed_pixels = verical_filter * local_pixels vertical_score = (transformed_pixels.sum() +4)/8 vertical_edges_img[row, col] = [vertical_score] * 3 plt.imshow(vertical_edges_img)
注:原脚本执行后可得到垂直滤镜处理后的黑白结果图
改写后的函数
def vertical_img(img): verical_filter =[[-1,-2,-1],[0,0,0],[1,2,1]] n,m,d= img.shape # 获取图像的尺寸 vertical_edges_img = np.zeros_like(img) upsidedown_pic = np.array(img) for row in range(3, n-2): # 遍历每个像素 for col in range(3, m-2): local_pixels = img[row-1:row+2,col-1:col+2,1] transformed_pixels = verical_filter * local_pixels vertical_score = (transformed_pixels.sum() +4)/8 vertical_edges_img[row, col] = [vertical_score] * 3 return upsidedown_pic vert_img = vertical_img(img) plt.imshow(vert_img)
注:该函数执行后返回的是原图像,未达到预期效果
问题原因与修正方案
核心错误
改写后的函数中,你最终返回的是upsidedown_pic(原图像的拷贝),而非处理好的vertical_edges_img,这就是函数返回原图像的直接原因。
另外,原脚本中存在缩进错误:vertical_edges_img[row, col] = [vertical_score] * 3这行代码的缩进在for col循环之外,会导致每一行只有最后一列的像素被赋值,其余列的处理结果无法保存,需要修正缩进。
修正后的函数
def vertical_img(img): verical_filter =[[-1,-2,-1],[0,0,0],[1,2,1]] n,m,d= img.shape # 获取图像尺寸 vertical_edges_img = np.zeros_like(img) for row in range(3, n-2): for col in range(3, m-2): # 提取绿色通道的局部像素 local_pixels = img[row-1:row+2,col-1:col+2,1] transformed_pixels = verical_filter * local_pixels vertical_score = (transformed_pixels.sum() +4)/8 # 将结果赋值给当前像素的三个通道 vertical_edges_img[row, col] = [vertical_score] * 3 return vertical_edges_img vert_img = vertical_img(img) plt.imshow(vert_img)
内容的提问来源于stack exchange,提问作者user58066
相关产品推荐
相关产品推荐

