MWORKS-Julia语言(四)——缩放(俄式比例bushi)

题目:编写函数,实现一副彩色图像的横向2倍放大,纵向放缩到500个像素,并在硬盘上保存该放大图像。(利用内插函数实现,不是imresize调用)。

一、题目中功能要求

1.读取彩色图像

2.横向放大

3.纵向放缩

4.保存

5.函数实现

二、代码实现

using Images, FileIO, Interpolations

function resize_image_custom(input_path::String, output_path::String)
    try
        #1.使用更可靠的imread函数读取图像
        @info "正在读取图像..."
        img = imread(input_path)
        
        #2.将图像统一转换为标准RGB或灰度格式
        if ndims(img) == 2  #如果是灰度图
            img = Gray.(colorview(RGB, permutedims(img, (3,1,2)) ./ 255))
        else  #如果是彩色图
            img = RGB.(colorview(RGB, permutedims(img, (3,1,2)) ./ 255))  #强制转换为RGB格式
        end
        
        @info "图像读取成功,格式:$(typeof(img)),原始尺寸:$(size(img))"

        #3.获取正确的原始尺寸(height, width)
        h_orig, w_orig = size(img)
        
        #4.计算目标尺寸
        w_new = 2 * w_orig  #横向2倍
        h_new = 500         #纵向固定500像素
        @info "目标尺寸:宽度 $w_new px,高度 $h_new px"

        #5.准备图像数据用于插值
        @info "准备图像数据..."
        img_float = Float32.(channelview(img))
        num_channels = size(img_float, 1)
        @assert num_channels == 3 || num_channels == 1 "通道数应为1或3,实际得到$num_channels"
        @info "图像通道数:$num_channels (3=RGB, 1=灰度)"

        #6.创建插值器(双线性插值)
        @info "创建插值器..."
        itp = interpolate(img_float, BSpline(Linear()))
        etp = extrapolate(itp, Flat())

        #7.初始化新图像矩阵
        @info "初始化输出图像..."
        scaled_img = zeros(Float32, num_channels, h_new, w_new)

        #8.执行缩放(显示进度)
        @info "开始图像缩放..."
        for y_new in 1:h_new
            #显示进度
            if y_new % 50 == 0
                progress = round(y_new/h_new * 100, digits=1)
                @info "处理中... $progress% 完成"
            end
            
            for x_new in 1:w_new
                #计算原始坐标
                x_orig = clamp(x_new / 2, 1, w_orig)
                y_orig = clamp(y_new * h_orig / h_new, 1, h_orig)
                
                #执行插值
                for c in 1:num_channels
                    scaled_img[c, y_new, x_new] = etp[c, y_orig, x_orig]
                end
            end
        end

        #9.转换回图像格式
        @info "转换图像格式..."
        if num_channels == 3
            result = colorview(RGB, scaled_img)
        else
            result = colorview(Gray, scaled_img)
        end
        result = clamp01!(result)

        #10.保存图像
        @info "正在保存图像..."
        FileIO.save(output_path, result)
        
        return true

    catch e
        @error "处理图像时出错:" exception=(e, catch_backtrace())
        return false
    end
end
#实际调用函数的示例(替换为你的实际文件路径)
input_path = "picture.png"
output_path = "output_resized.jpg"

#调用函数处理图像
if resize_image_custom(input_path, output_path)
    println("图像处理完成!输出文件保存在: ", output_path)
else
    println("图像处理失败,请检查错误信息。")
end

三、结果展示

四、疑问

若本代码报错,有以下几种可能:

(1)未安装包/包没更新;

(2)图片格式问题(可能不是RGB);

(3)图片数据通道有问题(之前改了几版都卡在通道异常,应该是3或1但显示619,不过博主这个代码应该没什么问题了);

(4)查看具体报错信息,咨询AI辅助修改。

欢迎各位同学交流互助交作业!交作业的时候突然发现神似俄式比例hhh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值