题目:编写函数,实现一副彩色图像的横向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