MWORKS-Julia语言(三)——子块图像和交换
(3).把左上子块和右下子块图像进行交换,把右上子块和左下子块图像进行交换,并显示交换了子块后的图像。题目:编写一个函数,以图像文件路径为输入参数,返回处理后的图像。(1) 图像灰度值通过y=x2变换并线性拉伸到[0255];(2).图像分成上下左右四个子块,并显示这四个子块图像;(4)查看具体报错信息,咨询AI辅助修改。(2)图片格式问题,可能是通道不一样;(3)图片数据奇数无法整除问题;欢迎各
·
题目:编写一个函数,以图像文件路径为输入参数,返回处理后的图像。
(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辅助修改。
欢迎各位同学交流互助交作业!
更多推荐
所有评论(0)