基于matlab的数字图像基本处理运算

article/2025/8/19 2:48:15

一、实验目的

(1)掌握线性拉伸和非线性拉伸的概念实现方法

(2)掌握图像代数运算的概念和实现方法

(3)掌握图像放大、缩小、平移、镜像、旋转原理和实现方法

(4)掌握最邻近插值和双线性插值在几何变换中的应用

二、实验仪器(软件平台)

计算机,Matlab软件

三、实验原理

原图像f,新图像g。

1、灰度线性变换

g(x,y)=a*f(x,y)+b;通过不同的a值和b值来对图像进行灰度变换。

2、灰度拉伸

(1)灰度拉伸变换

利用归一化公式f-minmax-min把图像矩阵进行归一化,在通过给定的拉伸参数,把灰度值重新映射到拉伸参数的范围中。

(2)对数变换

对数变换公式gx,y=clg(1+f(x,y)),c是一个常数。对数变换的作用是对原图像的灰度值动态范围进行压缩,主要用于调高输入图像的低灰度值。

(3)拉伸函数imadjust()

img=imadjust( I,[low_in;high_in],[low_out;high_out],gamma)中[low ,high]是增强前灰度级范围,[bottom,top]是增强后灰度级范围,参数gamma指定了曲线的形状,该曲线用来映射I的亮度值。如果gamma小于1,映射被加权到更高的输出值。如果gamma大于1,映射被加权到更低的输出值。如果省略了函数的参量,则gamma默认为1(线性映射)。

3、放大缩小

 

4、平移

设初始坐标为(x0,y0)的像素平移(∆x,∆y)后的坐标为(x1,y1),如下所示,

       

 

5、镜像

设图像高度为h,宽度为w。

 

图 1 水平镜像

图 2垂直镜像

                                                                                   

6、旋转

  

 

 

 

7、最近邻插值

这是最简单的一种插值方法,不需要计算,在待求像素的四邻像素中,将距离待求像素最近邻的像素灰度值赋给待求像素。最近邻插值法虽然计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。

 这是非整数倍放大图像的最近邻插值的计算方法。

8、双线性插值

9、三次差值

三次插值法求一个三次的方程。它的思想就是把已知的数分为一个一个小区间,人拟合到曲线上去。就是一个多分段函数高阶函数(此处的阶数为3)。

(1)任意选择几幅图像,对其进行灰度线性变换,结合以下情况分析输入图像和输出图像两者有何变化。

clc;clear;
close all
%y=a*r+b/255;中r是8位整型,b/255debianhua太小了,会直接被舍弃,解决方法1:把r改为double型
%解决方法2:b/255改为b,b取值大一点,100,50,不要10那么小
%r = imread('D:\Matlab\toolbox\images\imdata\yellowlily.jpg'); 
%r = imread('g:\图片\相册\微信图片_20200611154901.jpg');
r = imread('yellowlily.jpg');
subplot(4,2,1);
imshow(r);title('yuantu');
a=2;b=10;y=a*r+b;subplot(4,2,2);imshow(y);title('y a>1');a=0.5;b=10;y1=a*r+b;subplot(4,2,3);imshow(y1);title('y1 a<1');a=1;b=-50;y2=a*r+b;subplot(4,2,4);imshow(y2);title('y2 a=1,b<0');a=1;b=50;y3=a*r+b;subplot(4,2,5);imshow(y3);title('y3 a=1,b>0');a=1;b=0;y4=a*r+b;subplot(4,2,6);imshow(y4);title('y4 a=1,b=0');a=-1;b=255;y5=a*r+b/5;subplot(4,2,7);imshow(y5);title('y5 a=-1,b=255');

 (2)选择几幅图像,对其进行灰度拉伸,选择不同的拉伸参数,观察图像与原图有何不同,总结灰度拉伸的原理。

%% 1.图像灰度拉伸主程序代码
%图像灰度拉伸主程序及拉伸函数代码
clc;clear all;close all;
img1 = imread('indiancorn.jpg');
img1 = rgb2gray(img1);
para = [0,60];
img_lena2 = my_Gray_Scale_T(img1, para);
para = [60,128];
img_lena3 = my_Gray_Scale_T(img1, para);
para = [100,250];
img_a4 = my_Gray_Scale_T(img1, para);
%显示图像
figure(1); 
subplot(2,2,1);imshow(img1);title('原始图像');
subplot(2,2,2);imshow(img_lena2);title('拉伸至0~60');
subplot(2,2,3);imshow(img_lena3);title('拉伸至60~128');
subplot(2,2,4);imshow(img_a4);title('拉伸至100~250');%% 2.图像灰度非线性拉伸(对数拉伸)程序
% 灰度非线性拉伸之对数拉伸程序C_img=imread('onion.png');  Img=rgb2gray(C_img);figure(2);subplot(1,2,1),imshow(Img); title('原始灰度图像');J=double(Img);%double类型--计算Img_log=40*(log(J+1));%对数变换 clog(f(x,y)+1)Img_gen=uint8(Img_log);%转为uint8类型--图像subplot(1,2,2),imshow(Img_gen);title(' 对数变换图像');%% 3.使用MATLAB函数imadjust拉伸
% 使用MATLAB函数imadjust拉伸
% 对灰度图像进行直接灰度变换;
%I为增强前灰度图像,J为增强后的灰度图像
%[low high]增强前灰度级范围
%[bottom top]增强后灰度级范围
% img=imadjust( I,[low_in;high_in],[low_out;high_out],gamma)
% 该gamma参数为映射的方式,默认值为1,即线性映射。当gamma不等于1时为非线性映射
%将图像I中low_in至high_in之间的值映射到low_out至high_out之间,而low_in以下和high_in以上的值被剪切掉。
%输入图像I应该为uint8、uint16或double类的灰度图像,输出图像J与输入图像I类型相同。
%参数gamma指定了曲线的形状,该曲线用来映射I的亮度值。如果gamma小于1,映射被加权到更高的输出值。
%如果gamma大于1,映射被加权到更低的输出值。如果省略了函数的参量,则gamma默认为1(线性映射)。
Img01=imread('yellowlily.jpg');
img=rgb2gray(Img01);
bw1=im2bw(img,0.8);%转为二值图像,level=0.8,--level*255--超过255*level的赋值255,否则赋值0
New_img=imadjust(img,[0.1 0.6], [0 1],0.5);%把[0.1,0.6]之间的值映射到【0,1】之间
bw=im2bw(New_img,0.8);%把拉伸新得到的图像转为二值图像
bw=medfilt2(bw);%中值滤波 
figure(3)
subplot(1,3,1);imshow(Img01);title('原始图像');
subplot(1,3,2);imshow(bw1);title('二值图像');
subplot(1,3,3);imshow(bw);title('过中值滤波的二值图像');%% 3.图像放缩程序代码
%axis on--显示坐标
I=imread('x.jpg');
figure(4);
subplot(231);imshow(I);title('原图');
J1=imresize(I,0.5,'nearest');
subplot(232);imshow(J1);title('放大图');
J2=imresize(I,2,'nearest');
subplot(233);imshow(J2);title ('缩小图');
J3=imresize(I,[620,380],'nearest');
subplot(234);imshow(J3);axis on;title ('非比例放大图');
J4=imresize(I,[80,180],'nearest');
subplot(235);imshow(J4);title ('非比例缩小缩小图');%% 4.图像镜像变换程序
% 图像镜像变换程序
clc;clear 
Img=imread('x.jpg');
[M,N]=size(Img);
Img_Horizontal=Img;%Horizontal 水平 x1=x0;y1=w-y0,w水平长度--列
for i=1:Mfor j=1:NImg_Horizontal(i,j)=Img(i,N-j+1);end
end
figure(5);
subplot(2,2,1);imshow(Img);title('原始图像');
subplot(2,2,2);imshow(Img_Horizontal);title('水平镜像');
Img_vertical=Img;%垂直,x1=h-x0,y1=y0,h图像的高--行
for i=1:Mfor j=1:NImg_vertical(i,j)=Img(M-i+1,j);end
end
subplot(2,2,3);imshow(Img_vertical);title('垂直镜像');%% 5.图像旋转程序
% 图像旋转程序代码
%B=imrotate(A,angle,method,bbox)---将图像A以原点为中心按照angle角度进行旋转,旋转时采用method的方法进行插值,bbox为旋转之后图像的大小。
%angle大于0,逆时针方向旋转;angle小于0,顺时针方向旋转。
%method---‘nearest’最近邻插值(默认),'bilinear’双线性插值,‘bicubic’双三次插值
%bbox---‘crop’表示输出图像与输入图像大小相等,旋转后的图像进行剪裁;‘loose’表示能将完整旋转图像容下的足够大的图像。
Img=imread('tree.png');
figure(6);
subplot(221);imshow(Img);title('原始图像');
I1=imrotate(Img,30);                  %旋转30°
I2=imrotate(Img,30,'crop');           %旋转30°并剪切图像,使旋转后的图像和原图像大小一致
I3=imrotate(Img,30,'bilinear','crop');%双线性插值法旋转30°并剪切图像,使图像和原图像大小一致
subplot(222);imshow(I1);title('原图像旋转30°');
subplot(223);imshow(I2);title('原图像旋转30°并剪切');
subplot(224);imshow(I3);title('基于双线性插值旋转30°并剪切');%% 6.使用matlab函数的图像旋转与灰度插值实验
%使用matlab函数的图像旋转与灰度插值实验
%常用不同插值方法比较
clc;clear 
img = imread('women.jpg'); 
rotateimg1=imrotate(img,45,'nearest');   %最邻近插值 
rotateimg2=imrotate(img,-45,'bilinear'); %双线性插值 
rotateimg3=imrotate(img,45,'bicubic');   %三次插值 
figure(7);
subplot(2,2,1);imshow(img); title('原始图像'); 
subplot(2,2,2);imshow(rotateimg1); title('最邻近插值'); 
subplot(2,2,3);imshow(rotateimg2); title('双线性插值'); 
subplot(2,2,4);imshow(rotateimg3); title('高阶插值');%% 7.图像错切变换程序
%Matlab实现图像错切源代码
im=(imread('onion.png'));
figure(8);
subplot(2,2,1);imshow(im);title('原始图像');
im1=rgb2gray(im);
subplot(2,2,2);imshow(im1);title('灰度图像');
[row,col]=size(im1); %获取行数 和 列数
%图像的水平错切
G=zeros(row,col);
a=pi/6; %水平错切30度
b=tan(a);
for m=1:row
for n=1:col
G(round(m+b*n),n)=im1(m,n);
end
end
subplot(2,2,3);imshow(uint8(G));title('垂直错切图像');
G=zeros(row,col);
a=pi/6; %水平错切30度
b=tan(a);
for m=1:row
for n=1:col
G(n,round(m+b*n))=im1(m,n);
end
end
subplot(2,2,4);imshow(uint8(G));title('水平错切30度图像');%% 自定义拉伸函数
%拉伸函数代码   ----函数定义需要在文件结尾
function img = my_Gray_Scale_T(img, para)a = para(1);b = para(2);if(a > b)error('para参数,最小灰度值a不能超过最大灰度值b!');elseif(a < 0 || b > 250)error('para参数,最小灰度值a和最大灰度值b的范围在0~255!');endimg_norm = im2double(img);% uint8转换为double,并将0~255范围归一化为区间0~1img_min = min(img_norm(:));%(:)将每一列合并成一个长列img_max = max(img_norm(:));%从一个长列里选出最大值%(矩阵每个元素减去最小值)点除(最大值减去最小值)----归一化?----原本的值占总的img = (img_norm - img_min)./(img_max - img_min);%将图片压缩到0~1之间的数值%(区间最大值减最小值)点乘上一步得到的归一化+区间a,---根据归一化得到的权值在[a,b]上分配灰度值img = (b - a) .* img + a;           %像素值还原到原para区间img = uint8(img);                   %灰度转换为uint8的格式
end

 实验结果

图 12 灰度线性变换

图 13 灰度拉伸

图 14 对数变换

图 15 imadjust拉伸函数

图 16 比例缩放和非比例缩放

图 17 镜像

图 18 旋转并剪切

图 19 旋转不剪切

图 20 错切

由图 12可得如果a>1,输出图像的对比度增大,即图像变得更亮;如果a<1,输出图像的对比度减小,即图像变得更暗;如果a=1,b<0,输出图像整体上是变暗了,但是亮的地方与暗的地方存在一定的对比度;如果a=1,b>0,输出图像整体变亮,明暗对比度减低;如果a=1,b=0,输出图像没有变化;如果a=1,b=255,输出图像变暗,看不清物体形状。

图 18看到图像旋转后大小不变,但是经旋转而离开画面的部分被剪切,而图 19中的图像旋转后没有被剪切图像,但是图像大小出现变化。

图19可以看出通过最近邻插值法的图像在灰度变化的地方存在明显的锯齿状,程度是三个插值法中最严重的,双线性插值法也存在轻微的锯齿问题,但是比最近邻插值要细微些,而三次多项式插值法最效果最好的一个。


http://chatgpt.dhexx.cn/article/ZKnpvNEI.shtml

相关文章

实验二 图像增强方法编程与应用

目录 一、实验目的 1. 理解常见图像增强方法的原理和特点&#xff1b; 2. 掌握常见的灰度线性和非线性变换方法&#xff1b; 3. 掌握直方图均衡增强的原理与应用方法&#xff1b; 4. 掌握模板卷积的概念、原理与实现方法 5. 掌握均值滤波的技术原理与实现方法&#xff1b…

PyTorch:tensor、torch.nn、autograd、loss等神经网络学习手册(持续更新)

PyTorch1&#xff1a;tensor2、torch.nn、autograd、loss等神经网络学习手册&#xff08;持续更新&#xff09; 链接&#xff1a;画图、读写图片 文章目录 一、tensor二、完整训练过程&#xff1a;数据、模型、可学习参数、保存与加载1、数据dataa、构建网络-数据b、补充知识&…

Android编译libjpeg-turbo so高效压缩图片

https://www.jianshu.com/p/8ebe0ddd21f7 https://www.jianshu.com/p/f305fb008ab6 一 . 图片的基本知识 图像是由像素组成的&#xff0c;而像素实际上是带着坐标的位置和颜色信息的。它是有若干行和若干列的点组成的&#xff0c;他们相交就会有无数个点。假如我们随便取出一个…

(数字图像处理MATLAB+Python)第二章数字图像处理基础-第三、四节:数字图像的生成和数值描述

文章目录 一&#xff1a;数字图像的生成与表示&#xff08;1&#xff09;图像信号的数字化&#xff08;2&#xff09;数字图像类型 二&#xff1a;数字图像的数值描述&#xff08;1&#xff09;常用坐标系&#xff08;2&#xff09;数字图像的数据结构&#xff08;3&#xff09…

MATLAB GUI设计 图像处理基本操作(二)

一、直方图及直方图均衡化 直方图是从图像灰度图中提取的亮度信息&#xff0c;包含灰度级和像素数&#xff0c;对于uint8图像其灰度级为0~255&#xff08;2^8256&#xff09;&#xff0c;用imhist&#xff08;&#xff09;函数显示。imhist&#xff08;&#xff09;/numel可获…

ff

文章目录 1.变数与变量存档1.1变量类型转换1.1.1语法说明1.1.2单一字元1.1.3多元字元1.1.3.1说明1.1.3.2创建对象1.1.3.3逻辑运算和分配 1.2结构体1.2.1存储异构数据的方法1.2.2向结构添加信息2.2.2.1延伸拓展 1.3结构功能1.3.1功能基础语法1.3.2功能语法举例 1.4嵌套结构1.5元…

数字图像处理学习笔记 四 傅里叶变换和频率域滤波

目录 一 预备知识&#xff1a;傅里叶级数的介绍 1、一维傅里叶变换数学推导 2、图像傅里叶变换的物理意义 3、二维傅里叶变换 二、频率域滤波 1、频率域与空间域之间的关系 2、频率域滤波的基本步骤 3、使用频率域滤波平滑图像 4、使用频率域滤波锐化图像 5、选择率滤波…

第五章 DirectX 光照,材质和纹理(下)

在计算机三维世界中&#xff0c;想要模拟出真实的物体&#xff0c;让它的表面看起来更加逼真&#xff0c;就需要使用“纹理映射”技术&#xff0c;简单讲就是一种将2D图像映射到3D物体上面。一般来说&#xff0c;纹理是表示物体表面细节的一幅或多幅2D图像&#xff0c;也称为纹…

数组属性和基本操作

数组属性和基本操作 np.arange(start150,stop0,step-1) 将值倒过来 import numpy as np #matplotlib画图的&#xff0c;也可以读取图片 import matplotlib.pyplot as plt np.arange(150, 1, step-1) 输出 array([150, 149, 148, 147, 146, 145, 144, 143, 142, 141, 140, 1…

灰度增强和去噪

futurehello博客 http://blog.csdn.net/xixi_0921/article/details/50533487 整理笔记 一、前言 图像的灰度变换则不同&#xff0c;其对像素的计算仅仅依赖于当前像素和灰度变换函数。 灰度变换也被称为图像的点运算&#xff08;只针对图像的某一像素点&#xff09;是所有图…

Chapter_06 更改图像的对比度和亮度

文章目录 一. 本章目标① 目标② 理论③ 代码 二. 实例① 亮度和对比度调整② 伽马校正③ 纠正曝光不足的图像 三. 图形渲染中的伽马校正(附加资源) 一. 本章目标 ① 目标 本教程中我们将学习如何: 访问像素值用零初始化矩阵学习cv::saturate_cast是做什么的,以及它有什么用获…

MATLAB和Intislim,matlab灰阶变换函数imadjust和stretchlim的c++实现

灰阶变换 首先介绍一下灰阶变换&#xff0c;一幅图像数据本身在存储的数据结构上为一个二维的矩阵&#xff0c;即一幅图像为m*n个密密麻麻的像素点构成。 image.png 然后&#xff0c;这些像素点有着一个值&#xff0c;这个值成为灰度值或者亮度值&#xff0c;值的范围为[0,255]…

一个app开发周期是多久?快速开发才是主流

app的出现&#xff0c;极大的方便了人们的生活、社交和工作&#xff0c;各种各样的app为人们提供了各种便利的服务&#xff0c;真正让移动互联网服务大众。许多行业看到在app上爆发出的巨大潜能&#xff0c;都纷纷主动进行app制作来迎接移动互联网浪潮。 开发app一个很重的问题…

如何开发app软件?程序员揭秘你还没听过的1种方法

如何开发app软件&#xff1f;app软件开发需要多少钱&#xff1f;现在手机app这么火&#xff0c;很多企业都想开发一个app软件开拓市场。但是在开发app的时候往往会感觉力不从心&#xff0c;因为app开发门槛比较高&#xff0c;大家对app软件开发需要的技术、成本并不了解。 现…

商城APP软件开发要素有哪些

商城APP软件体系是当今电商行业经常会运用的商城体系&#xff0c;既支撑企业对企业的运营形式&#xff0c;也支撑卖家对消费者的运营形式&#xff0c;便是现在常见的B2C&#xff0c;B2B的电商形式APP&#xff0c;跟着现在的互联网的遍及现在这些电商都是成为了电商商家开展的不…

app软件怎么开发 盘点3种app制作方式

现在智能手机给大家的生活带来了很多便利&#xff0c;利用手机&#xff0c;随时随地看新闻、手机打车提前预定、网上订餐不用等、商家服务提前预约、学习内容随时看、购物更是随时买。各式各样的手机App&#xff0c;让生活方式方式了重大改变。 1、组建团队开发APP 自己有团队…

app应用软件开发流程是怎样的?

从入职这行业到创业已有 7 载&#xff0c;对 APP 产品开发的流程已经再熟悉不过了&#xff0c;现在把这几年积累的一些经验和大家分享一下&#xff0c;一个产品是怎么从想法一步一步落地为具体成品的&#xff0c;这个过程中会经历一些怎样的必要流程呢&#xff0c;下面大致说一…

三阶魔方傻瓜指南

三阶魔方20分钟完全自救指南——包学包会 前言 寒假宅在家里&#xff0c;闲来无事&#xff0c;偶得一个三阶魔方&#xff0c;便从网上找公式摸索。发现了很多版本&#xff0c;但是大多局部最优&#xff0c;缺少易于小白理解的全局最优方法。所以做次总结&#xff0c;集各家所…

C/C++FPS实战CSGO矩阵方框透视骨骼自瞄实战教程

C/CFPS实战CSGO矩阵方框透视骨骼自瞄实战教程

基于yolo5制作的csgo,ai自瞄

研究了几天&#xff0c;终于肝出来了&#xff0c;基本功能完美运行&#xff0c;晚点在训练一个专用模型。