题目:编写一个函数,以图像文件路径为输入参数,返回处理后的图像。

(1) 图像灰度值通过y=x2变换并线性拉伸到[0255];

(2).图像分成上下左右四个子块,并显示这四个子块图像;

(3).把左上子块和右下子块图像进行交换,把右上子块和左下子块图像进行交换,并显示交换了子块后的图像。

一、题目中功能要求

1.读取彩色图像

2.灰度处理

3.线性拉伸

4.分块

5.交换子块图像

二、代码实现

# 导入必要的图像处理包
using Images, FileIO, ImageView

# 用function函数来实现图像处理功能
function process_image(image_path::String)
    #加载图像
    println("正在加载图像: $image_path")
    img = imread(image_path)#使用FileIO的imread函数读取图像
    println("原始尺寸: ", size(img))#打印原始图像尺寸

    #转换为灰度图像,这个./255看实际情况
    gray_img = if ndims(img) == 3
        #对RGB图像使用标准灰度转换公式 (ITU-R BT.601标准)
        r = img[:,:,1] ./ 255  #提取红色通道并归一化
        g = img[:,:,2] ./ 255  #提取绿色通道并归一化
        b = img[:,:,3] ./ 255  #提取蓝色通道并归一化
        Gray.(0.299*r + 0.587*g + 0.114*b)  #加权平均转换为灰度
    else
        Gray.(img ./ 255)  #已经是灰度的直接处理
    end
    println("灰度图尺寸: ", size(gray_img))  #打印灰度图像尺寸

    #灰度变换和拉伸
    transformed = gray_img .^ 2  #对灰度值进行平方变换
    min_v, max_v = extrema(transformed)  #计算变换后的最小和最大值
    #对比度拉伸到0-255范围
    stretched = clamp.((transformed .- min_v) .* (255 / (max_v - min_v)), 0, 255)

    #分割图像为4个子块,有时候报错图片奇数无法整除,但这个代码应该没问题
    h, w = size(stretched)  #获取图像高度和宽度
    h1, w1 = ceil(Int, h/2), ceil(Int, w/2)  #计算中间点
    
    #将图像分成4个矩形区域
    blocks = (
        tl = stretched[1:h1, 1:w1],  #左上子块
        tr = stretched[1:h1, w1+1:end],  #右上子块
        bl = stretched[h1+1:end, 1:w1],  #左下子块
        br = stretched[h1+1:end, w1+1:end]  #右下子块
    )

    #显示四个子块图像
    println("\n显示四个子块:")
    try
        #尝试使用ImageView显示 (提供更好的可视化)
        ImageView.imshow(blocks.tl, name="左上子块")
        ImageView.imshow(blocks.tr, name="右上子块")
        ImageView.imshow(blocks.bl, name="左下子块")
        ImageView.imshow(blocks.br, name="右下子块")
    catch e
        #如果ImageView不可用,回退到基本显示方法
        @warn "ImageView不可用,使用基本显示方法"
        display(blocks.tl)
        display(blocks.tr)
        display(blocks.bl)
        display(blocks.br)
    end

    #交换子块位置
    swapped = copy(stretched)  #创建拉伸后图像的副本

    #将右下子块(br)移动到左上角
    swapped[1:size(blocks.br,1), 1:size(blocks.br,2)] = blocks.br

    #将左上子块(tl)移动到右下角
    swapped[end-size(blocks.tl,1)+1:end, end-size(blocks.tl,2)+1:end] = blocks.tl

    #将左下子块(bl)移动到右上角
    swapped[1:size(blocks.bl,1), end-size(blocks.bl,2)+1:end] = blocks.bl

    #将右上子块(tr)移动到左下角
    swapped[end-size(blocks.tr,1)+1:end, 1:size(blocks.tr,2)] = blocks.tr

    #显示交换后的图像
    println("\n显示交换后的图像:")
    try
        ImageView.imshow(swapped, name="交换后图像")
    catch
        display(swapped)  #回退到基本显示方法
    end

    #返回处理结果: 拉伸后的图像, 四个子块, 交换后的图像
    return stretched, blocks, swapped
end

#自动安装缺失包
required_pkgs = ["Images", "FileIO", "ImageView"]  #需要的包列表
using Pkg
for pkg in required_pkgs
    if !(pkg in keys(Pkg.installed()))  #检查包是否已安装
        println("正在安装 $pkg...")
        Pkg.add(pkg)  #安装缺失的包
    end
end

#处理图像
image_path = "picture.png"  #图像文件路径,注意把\改成/
if isfile(image_path)  #检查文件是否存在
    process_image(image_path)  #调用处理函数
    println("\n处理完成!")
else
    println("错误:文件不存在!")
    println("检查路径: ", abspath(image_path))  #打印绝对路径帮助调试
end

 三、结果展示

四、疑问

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

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

(2)图片格式问题,可能是通道不一样;

(3)图片数据奇数无法整除问题;

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

欢迎各位同学交流互助交作业!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐