数字图像处理实验记录二(直方图和直方图均衡化)

news2024/12/24 2:42:30

文章目录

  • 一、基础知识
    • 1,什么是直方图
    • 2,直方图有什么用
    • 3,直方图均衡化
    • 4、原理代码实现
  • 二、实验要求
    • 任务1:
    • 任务2:
  • 三、实验记录
    • 任务1:
    • 任务2:
  • 四、结果展示
    • 任务1:
    • 任务2:
  • 五、反思,总结与收获
    • 1,matlab函数怎么写:
    • 2,坑,图像数据的类型是uint8:
    • 3,均衡化后:
    • 4,规定化后:

前言:由于踩了一些坑,进度就慢了很多,争取尽快赶上进度

一、基础知识

1,什么是直方图

在我看来,直方图就是展示一个图像中每个灰度的数量的图
如下图所示:
在这里插入图片描述
右边这张图就是灰度直方图,横坐标表示灰度,纵坐标表示这个灰度的数量

2,直方图有什么用

有什么用?目前看来就是有个展示作用。当然,我们可以点击这个链接查看直方图对应变化对图像的影响。

3,直方图均衡化

感觉直方图均衡化是一种对直方图进行调整的方法,将现在的直方图按照我们希望的函数排布。
要进行直方图均衡化,首先我们要求出原始图像的直方图,再计算积累直方图:
在这里插入图片描述
对应灰度级的积累直方图就是按照上面公式计算,最后将对应像素的值改成四舍五入后的值就实现了这个操作了

4、原理代码实现

原理:求出积累概率密度后,不能改变灰度像素的数量,就改变灰度值,改变原对应灰度的灰度值
对应积累概率密度*255 = 均衡后灰度
在这里插入图片描述

这里以一张灰度图为例的代码实现:

function [value,Sk] = his_teq(S,L)
% 进行均衡化操作
% S是输入的数据
[height,width] = size(S); %获取输入值的高和宽
if(~exist('L','var'))
    L = 256;  % 如果未出现该变量,则对其进行赋值
end
[count,x] = imhist(S,L);

p = count; %原始图像中各个灰度出现次数
size(count);

% 这里算每个灰度的概率
for i=1:L
    p(i) = count(i)/height/width;
end

Sk = p;
for i=1:L %计算积累直方图
    tmp = 0;
    for j = 1:i
        tmp=tmp+p(j);
    end
    Sk(i) = (L-1)*tmp;
    Sk(i) = round(Sk(i));
end
% 替换
for i=1:height
    for j=1:width
        a = int16(S(i,j))+1; %这里是一个坑,我在这里犯了很多次
        value(i,j) = Sk(a);
        end
    end
end

value = uint8(value);
end

二、实验要求

任务1:

使用函数imhist及histeq对原图进行直方图均衡化处理,同屏显示处理前后图像及其直方图,比较异同,并讨论为什么数字图像均衡化后其直方图并非完全均匀分布。

任务2:

使用函数histeq对原图进行直方图规定化处理,同屏显示处理前后图像及其直方图,比较异同。

三、实验记录

任务1:

使用函数imhist及histeq对原图进行直方图均衡化处理,同屏显示处理前后图像及其直方图,比较异同,并讨论为什么数字图像均衡化后其直方图并非完全均匀分布。
这里我们使用imhist()函数展示直方图,用histeq函数进行均衡化:

clc;
clear;
close all;
% 实验三 直方图均衡化
a1 = imread('图片1.png');
a2 = imread('图片2.png');
a2 = rgb2gray(a2);

a1_im = imhist(a1);
a2_im = imhist(a2);

a1_teq = histeq(a1);
a2_teq = histeq(a2);
figure('NumberTitle','off','Name','任务1');
subplot(241); imshow(a1);title('图片1');
subplot(242); imshow(a1_teq);title('图片1均衡化');
subplot(243); imshow(a2);title('图片2');
subplot(244); imshow(a2_teq);title('图片2均衡化');
subplot(245); imhist(a1);title('图片1的直方图');
subplot(246); imhist(a1_teq);title('图片1均衡化的直方图');
subplot(247); imhist(a2);title('图片2的直方图');
subplot(248); imhist(a2_teq);title('图片2均衡化的直方图');

任务2:

使用函数histeq对原图进行直方图规定化处理,同屏显示处理前后图像及其直方图,比较异同。
规定化步骤:
1,获取模板:a1_im = imhist(a1);像这样,就是先获取直方图
2,使用函数:a3 = histeq(a2,a1_im); 像这样,a2是图片,a1_im是直方图模板
代码:

clc;
clear;
close all;
% 实验三 直方图均衡化

a1 = imread('图片1.png');
a2 = imread('图片2.png');
a2 = rgb2gray(a2);

a1_im = imhist(a1);
a2_im = imhist(a2);

a1_teq = histeq(a1);
a2_teq = histeq(a2);
figure('NumberTitle','off','Name','任务1');
subplot(241); imshow(a1);title('图片1');
subplot(242); imshow(a1_teq);title('图片1均衡化');
subplot(243); imshow(a2);title('图片2');
subplot(244); imshow(a2_teq);title('图片2均衡化');
subplot(245); imhist(a1);title('图片1的直方图');
subplot(246); imhist(a1_teq);title('图片1均衡化的直方图');
subplot(247); imhist(a2);title('图片2的直方图');
subplot(248); imhist(a2_teq);title('图片2均衡化的直方图');
figure('NumberTitle','off','Name','任务2.1');
a3 = histeq(a2,a1_im);
subplot(221); imshow(a2);title('图片2');
subplot(222); imhist(a2);title('图片2的直方图');
subplot(223); imshow(a3);title('图片2规定化');
subplot(224); imhist(a3);title('图片2规定化的直方图');
figure('NumberTitle','off','Name','任务2.2');
a3 = histeq(a1,a2_im);
subplot(221); imshow(a1);title('图片1');
subplot(222); imhist(a1);title('图片1的直方图');
subplot(223); imshow(a3);title('图片1规定化');
subplot(224); imhist(a3);title('图片1规定化的直方图');

四、结果展示

任务1:

在这里插入图片描述

任务2:

按图片1的直方图规定化图片2:
在这里插入图片描述
按图片2直方图规定化图片1:
在这里插入图片描述

五、反思,总结与收获

1,matlab函数怎么写:

function [output] = name(input1,input2)
% 注释,说明函数的功能
output = 1 %内容
end %结束标志

2,坑,图像数据的类型是uint8:

图像数据类型是uint8,也就说明了这个没有符号,范围在0~255,所以如果你想取其作为下标或者进行计算的话需要注意。
如在这里:
在这里插入图片描述
S(i,j)可能会为255,当我们直接显示Sk(S(i,j)+1)时,S(i,j)=255,S(i,j)+1也等于255,因为matlab把它默认成了uint8数,所以在运算之前,我们要对其类型进行改变,这样才能运算

3,均衡化后:

均衡化后,其结果并不会如我们想象那样那么均衡,往往会如以下:
在这里插入图片描述
这个是按256个灰度值进行均衡化的
为什么数字图像均衡化后其直方图并非完全均匀分布呢?在我看来,其实是因为原图像的直方图本来就不是很均衡,甚至有突出的地方,在后续计算概率密度直方图时,哪个灰度值的数量多,对应的概率也就大,这样也就导致了均衡化后的直方图变成和原图差不多的样子。

4,规定化后:

在这里插入图片描述
在这里插入图片描述
不难看出,规定化是按照一个直方图的模板对另一个直方图进行变换,规定化后的直方图和模板直方图很相似

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1110079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用Cpolar永久免费内网穿透软件实现IStoreOS安装与远程访问

文章目录 前言1. ssh局域网登陆iStoreOS系统2. 安装Cpolar内 网穿透软件3. 测试公网远程链接4. 公网使用固定http地址远程访问iStoreOS webui界面 前言 iStoreOS系统是基于OpenWrt定制的软路由系统,提供了如轻nas,云盘,文件共享等众多网络服务…

【EI会议征稿】2024年智能电网与人工智能国际学术会议(SGAI 2024)

2024年智能电网与人工智能国际学术会议(SGAI 2024) 2024 International Conference on Smart Grid and Artificial Intelligence 随着时代的发展,基础的电网技术已经比较成熟,但与日俱增的用电需求以及不断转变的用电模式促使我们需要不断地…

Go 存储系列:LSM存储引擎 LevelDB

概念介绍 LSM-Tree 被是一种面向写多读少应用场景的数据结构 ,被 Hbase、RocksDB 等强力 NoSQL 数据库采用作为底层文件组织方式。 简单的LSM-Tree 包含 2 层树状数据结构: Memtable 并完全驻留在内存中(假设 T0) SStables 存储…

可视化(Visual) SQL初探

一、背景 在当今数字化时代,数据信息作为企业和组织的宝贵资源之一,如何挖掘其中的价值并帮助企业和组织个体决策,已然成为炙手可热的话题。数据分析作为其具体载体,是从数据中提取信息、洞察机遇、制定战略、做出决策的关键过程…

在云计算环境中,如何利用 AI 改进云计算系统和数据库系统性能

文章目录 前言一、关于唐明洁教授二、AI for System2.1 面向分布式作业的人工智能2.1.1 现阶段企业云计算系统环境所遇到的普遍痛点2.1.2 云计算系统环境所遇到的普遍痛点的解决方案(一)Google Autopilot Eurosys 2021方案(Pod级别&#xff0…

熟练使用 Redis 的五大数据结构:Java 实战教程

入门 入门阶段主要记住 Redis 的命令,熟练使用 Redis 的 5 大数据结构就可以了。 如果没有 Redis 环境,可以直接通过这个网址https://try.redis.io/,很赞,它会给你模拟一个在线的环境可供你尽情使用! 熟练使用Redis的…

C++11lambda表达式--你了解C++的lambda表达式吗?他的底层是怎样的呢?

文章目录 1.lambda表达式的出现1.1C98对内置类型排序1.2C98对自定义类型排序1.3C11中lambda表达式对数据进行排序 2.lambda表达式的语法2.1lambda表达式语法的介绍2.2lambda表达式语法的讲解1.交换函数的lambda表达式写法2.捕捉列表捕捉3.捕捉列表混合捕捉4.不能相互赋值 可以拷…

excel怎么固定前几行前几列不滚动?

在Excel中,如果你想固定前几行或前几列不滚动,可以通过以下几种方法来实现。详细的介绍如下: **固定前几行不滚动:** 1. 选择需要固定的行数。例如,如果你想要固定前3行,应该选中第4行的单元格。 2. 在E…

2023年全网最新 Windows10 搭建 Node.js 环境教程

目录 一、Node.js安装包下载1.1 官网下载node.js安装包1.2 百度网盘获取node.js安装包 二、Windows上安装Node.js三、配置npm在安装全局模块时的路径和缓存cache的路径二、Pycharm 调用 NodeJS 运行 js 代码的环境配置 本文将向大家介绍在 Windows10 上安装 Node.js 的方法。本…

短视频剪辑矩阵系统开发源码----源头搭建

短视频剪辑矩阵系统开发源码----源头搭建 目录 一、源码技术构建源码部署搭建交付之---- 二、短视频矩阵系统功能模型搭建 三、短视频矩阵系统开发的路径呢规则 一、源码技术构建源码部署搭建交付之---- 1.需要协助系统完成部署、接口全部正常接入、系统正常运行多久&#…

canvas操作像素的处理,图片操作例子,黑白蒙版等

经常拍照的同学会使用图片处理软件,给自己的照片加上各种效果。图片处理软件也是软件,同样也是由代码写的,那么如何实现图片处理呢,这章我们就探讨一下这个问题。 canvas中像素处理涉及到3个方法,我们先来看一下API吧…

Jmeter项目实战

一,性能测试流程 性能需求分析 性能方案设计 业务建模 脚本优化 执行测试 收集性能数据 结果分析 性能测试报告 二,性能需求分析 项目管理系统业务:登录 注册 搜索(一般最核心的就是登陆,大多只对登录做压测&a…

Spring framework day 01:spring 整合数据源(连接池)

前言 在现代的企业应用开发中,数据库是不可或缺的一部分。而对于大部分的应用程序来说,与数据库的交互涉及到频繁的连接、查询和事务操作。为了提高应用程序的性能和可扩展性,使用连接池来管理数据库连接是一个不错的选择。而 Spring 框架提…

基于多线程+队列实现生产者和消费者

基于多线程队列实现生产者和消费者 需求分析设计思路代码展示 需求分析 需要设计一个系统,能够实时接收视频传来的车牌数据并注入到对应的车辆实体类中。这可能涉及到多线程编程,以处理并监督车牌数据的流入和处理。下面是一种可能的设计思想&#xff1…

如何一起修改多张图片大小?一键修改多张图片尺寸的技巧

如果我们需要在社交平台上分享图片信息,就要把调整图片大小到平台要求的尺寸,单张图片尺寸修改比较简单,要是多张的话,为了提高处理效率,我们就要用到专业工具了;今天分享一个在线图片编辑器,利…

ES6 Class和Class继承

1.class的基本语法 class可以理解为是一个语法糖,将js只能通过构造函数创建实例的方法进行了补充 构造函数: function Person ({ name, age18 }) {this.name namethis.age age } new Person({name: 张三}) Class类: class Person {con…

TCP 传输、重传及工作原理

IP和MAC层的内存受限,用于发送数据包。因此,它们都会限制消息的长度。 这一限制要求TCP在提供给IP层之前,将可变长度的字节打包成多个段。每个段的长度应该是合适的。 下面是一个简单的图示,展示了段是如何通过互联网发送的。 1*I…

淘宝店铺所有商品数据接口及店铺商品数据分析

获取淘宝店铺所有商品数据的接口是淘宝开放平台提供的接口,通过该接口可以获取店铺所有商品数据。 通过淘宝开放平台接口获取店铺所有商品数据的方法如下: 在开放平台注册成为开发者并创建一个应用,获取到所需的 App Key 和 App Secret 等信…

华为数通方向HCIP-DataCom H12-831题库(单选题:301-310)

第301题 关于配置防火墙安全区域的安全级别的描述,错误的是 A、同一系统中,两个安全区域不允许配置相同的安全级别 B、只能为自定义的安全区域设定安全级别 C、安全级别一旦设定不允许更改 D、新建的安全区域,系统默认其安全级别为1 答案:D 解析: 新创建的安全区域缺省未…

UE4/5:通过Blender制作BlendShape导入【UE4/5曲线、变形目标,blender形态键】

UE4/5里面,我们经常可以在一些骨骼模型上面看到相关的曲线,如Metahuman里面就是通过这个曲线来改变人物的脸部表情。 而这里笔者将教导如何去制作这种曲线。 这种曲线都是存在于骨骼模型上的,所以我们要么直接制作骨骼模型导入ue&#xff0…