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

垂直滤镜脚本改写为函数后无法生成正确图像,求修正方案

垂直滤镜脚本转函数后失效问题求助

我编写了一个名为"垂直滤镜"的脚本,用于检测图像的垂直区域,区分水平区域并生成黑白分割的新图像。该脚本可输出预期的黑白结果图,但将其改写为函数后无法正常工作,返回的仍是原图像。以下是原脚本、改写后的函数代码:

原脚本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:47:45