matlab数字图像处理——直方图均衡重现老照片

任务 在课堂上学习了直方图均衡化的处理手段,看到外国女子的脸部增亮,这是在空域中实现变换增强的方法之一。尝试在matlab中实现相关方法,并用网上的老照片进行实验,效果不错。 过程 得到灰度图的直方图 灰度图的获取可以参考博文matlab数字图像处理——RGB转灰度图,当然也可以直接调用系统函数rgb2gray() 直方图其实是统计不同灰度等级的像素点数目大小,并通过除以图像像素点总数目,得到归一化结果/概率。 得到累积直方图 因为需要对灰度等级进行映射——把某个阶段的灰度值对应到均衡的结果,那么我们需要取得中间变量:累积直方图。 得到映射关系 映射关系可以利用matlab的矩阵运算实现,直接将表达式中的变量用矩阵替换即可。分别表述这行代码中变量的含义: cRecord:上一部分得到的累积直方图 256:总共的灰度等级 -1是因为在matlab中,uint8的范围在0~255 mapValue: 索引值继承等号右边唯一的矩阵——cRecord的含义,是每个灰度等级 内部的值表示通过运算映射得到新的灰度等级 根据新的映射关系修改原图的灰度值 这一步的目的比较清晰,已经通过上一步得到了映射关系,只要将原图中的灰度等级修改为映射后对应的灰度等级即可。 问题与解决方法 残影 整个过程比较顺利,只是第一次显示直方图时有些奇怪: 结果图P5只能隐约看到lena的轮廓,通过显示该图像的变量类型找到答案,变量并非图像的uint8类型,而是double类型。问题出在初始化变量上,我利用zeros()函数,当我把赋值改为强制类型转换后,问题解决。 class(newImg) ans = ‘double’ 结果展示 参考资料 如何提取特定位置以后的字符串(出处: MATLAB中文论坛) MATLAB中画柱状图

matlab实现FFT(快速傅里叶变换)

任务 接上篇,尝试使用快速傅里叶变换实现空域到频域转换 过程 判定2的幂次 由算法可知,对于长度为2的幂次的序列可以进行变换,但对于大多数情况非2的幂次应该如何解决?答案是补零至2的幂次。 判定 简单的判定方法,利用2的幂次(M)在二进制中的独特性,首位为1,余位为0;且减1后(M-1)原首位为0,余位为1,则有M&M-1=0 matlab中的按位与函数为bitand(),与&不同  bitshift(num,n); num表示需要移位的数,十进制; n为正左移,负右移。 求大于一个数字的二进制的最高位 思路,通过移位,当非2次幂数的第i位移出使原数为0,则最高位为i。可以将2次幂数-1转换为相同情况。 函数实现 首先强制类型转换,转换为固定的uint8类型。 matlab没有三目运算符,则用if…else语句实现。将特殊情况0单独列出, 调用临近最高位的求取函数highestOneSite(M) 位的对换 算法实现需要将输入数据排列为满足算法需要的次序,可以推导发现,满足的映射规则为第x个数为x的二进制数颠倒后的结果。 a是0~255的整数 b=dec2bin(a,8);%b是8位’0′,’1’字符串 h=b(1:4); %高四位 l=b(5:8); %低四位 MATLAB中怎么将一个常数(0到255)转为8位二进制数–dukinkin  但在matlab中,由于数组下标从1开始,需要进行-1的操作进行映射 即F(abcd)《-》f(dcba) bottom-up实现 足足思索了几个小时,终于捋清x点变换的逻辑。 指数部分函数W表示 其中W可视为函数: matlab代码为: 首先从一维开始理解,由于需要变换的矩阵长度已经过判定2的幂次并补零至最邻近的2的幂次(N=2^n),则可通过不断奇偶二分,从原始的N点变换,分解为两个N/2点变换,再到N/4点变换、……、8点变换、4点变换、2点变换。最后的1点变换,因为公式(1)中u为0,则指数项为0,即1点变换视为原值。 上面的思路确定了如何从需要变换的函数得到分解因子,本次实现通过从因子逐层自底向上推出。重点在于清楚公式中的分子的表示,以及在存储矩阵中的位置。 二维实现 利用matlab实现DFT(离散傅里叶变换)与优化 的读取图像和灰度图转换,得到了灰度图像grayImg 再利用之前的频移函数showShiftImg(twoD)得到频移到中心点的图像。 matlab技巧——如何利用其他文件夹下的函数 addpath D:\Matlab即可使用路径D:\Matlab下的函数 结果展示 ans = 442 785 3 时间已过 17.532276 秒。 现在运行给定图像需要的时间实际为17.5s,相比于优化后的DFT的12s居然不降反升,所以要想达到更有效的应用,需要继续优化。 参考文章 《图像工程 (上)<图像处理和分析>》… Continue reading matlab实现FFT(快速傅里叶变换)

matlab实现DFT(离散傅里叶变换)与优化

任务 《数字图像处理》课程布置: 编写程序(建议Matlab )对某选定图像(自行转换为灰度图)展开傅里叶变换,提取傅里叶变换图像(将频率原点移至图像中心) , 并形成实验报告。 为与matlab中代码一致,便于理解,此处的公式我全部整理为数组从下标1开始。此外,增强特殊性,图像大小为NxM 基本知识 此前尝试用matlab实现傅里叶变换,用基本公式对方波函数进行傅氏变换。但其特点: 函数连续(在matlab进行抽样离散处理,绘制波形) 范围趋近无限(在matlab中把n取大值范围) 可见,对于模拟值用计算机进行傅氏变换需要首先进行离散处理,那么对于本身是离散值的数字图像,则直接利用离散傅里叶变换即可。 这里图像大小为NxM 前面括号内的系数其实可舍去,主要起到归一化的作用,因此形式不必纠结。 首先,将二重变换利用傅氏变换的性质可以分解为两次单重变换: 与公式相一致:本人代码先按行遍历,对列(y表示)变换;再按列遍历,对行(x表示)变换 过程 读取图像 测试图片选取经典上图,但大小是压缩的200×200,因此对于初次使用比较友好。 matlab中句末引号可选,不加则会输出左值结果至命令行窗口,如上述代码的size(Img) 转换为灰度图 通过在读取的图像信息判断是否为单通道,是则直接使用,否则将RGB图像通过转换函数rgb2gray()转换为灰度图。 三重循环实现 可以通过tic,toc放在代码前后进行时长测试 注意u和v的范围是从0开始取值 ans = 200 200 3 时间已过 12.674382 秒。 频移函数 这里直接显示经过处理后的傅氏变换的图像 核心是将原图四个角点移至中心位置,可以通过matlab中矩阵处理的语法便捷实现 由于非偶数会出现不能被2整除情况,因此需要做取整处理 优化 使用上述算法经过讨论,复杂度为O(N^3),并且在处理更大尺寸的图像(老师提供785×442)时,运行时间极长。 因为了解到matlab对矩阵运算具有高效快速优点,便把思考放在如何将算法通过矩阵运算实现。 思路同样是通过两个一维变换完成,因此只以分析按行遍历,对列(y)展开为例,对思路进行陈述。 观察到公式中的基函数部分其实已经固定,因此直接通过相乘获得某个频率分量(Vn)对应的不同y值得出(某个频率分量)所有计算需要的指数部分,如下所示: 共N列 下一步将图像信息与对应的分量对应相乘,得到,那么加和则是对每行相加——每一行的x保持不变。最终得到一维转换后的结果: 具体代码 时间已过 16.837070 秒。 此用时与分钟相比下降很多,但比较系统中的fft(),用时约为0.1s,因此下一步可以思考如何进行快速傅里叶变换的使用。 参考资料 Matlab-结构体数组的索引 matlab里的图像处理函数

GPU概述

任务 在对CPU进行了解后,不妨下一步对与它相似的GPU进行系统认识。初次注意到它是对于深度学习设备的联系,感觉它具有卓越的运算性能。GPU对图像显示的功能主要体现在游戏画面,整个发展过程不妨随游戏的变化直观感受。 定义 图形处理器(英语:Graphics Processing Unit,缩写:GPU;又称显示核心、显卡、视觉处理器、显示芯片或绘图芯片)是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上运行绘图运算工作的微处理器。 意义 图形处理器使显卡减少对中央处理器(CPU)的依赖,并分担部分原本是由中央处理器所担当的工作,尤其是在进行三维绘图运算时,功效更加明显。图形处理器所采用的核心技术有硬件坐标转换与光源、立体环境材质贴图和顶点混合、纹理压缩和凹凸映射贴图、双重纹理四像素256位渲染引擎等。 技术背景与发展 黑白 最初,电脑中处理影像输出的显示芯片,通常很少被视为是一个独立的运算单元。虽然英伟达公司(NVIDIA)在1999年8月发表GeForce 256绘图处理芯片时首先提出GPU的概念,但从上世纪70年代起,已经可以在游戏机上显示图像,但方式是直接用CPU桶式移位器把图像数据输出到显示器上。 彩色 到80年代时,第一块使用大规模集成电路技术的GPU诞生,是美国的一家图像芯片公司制造的NEC µPD7220,它也带动了一次GPU革命浪潮,推动intel公司第一款图像处理芯片82720的出现,能够处理16位的彩色图像。 3D 随着图像显示技术的发展,越来越多种颜色可以显示在屏幕上,也应运而生了2D和3D的专用芯片,日本的游戏公司Namco在1988年发布的Namco System 21是第一款针对3D图像显示设计的游戏主板。 VGA与SVGA 这两个词语是在C课设期间耳熟能详的两种显示方案,其实它们的含义分别是: VGA是IBM于1987年提出的一个使用模拟信号的电脑显示标准。这个标准已对于现今的个人电脑市场已经十分过时。 原本SVGA是IBM用来扩展旧VGA标准而提出的新标准,之后SVGA是由开放组织VESA所制定,并且工业界放弃了为每个更高标准给定独特命名的企图。几乎在1990年后期至2000年前后,显卡能表现出的各种显示规格都被归类在SVGA中。 个人电脑 1990年代初期,Microsoft Windows的崛起引发人们对高性能、高清晰度二维位图运算的兴趣。在个人电脑市场上,Windows的优势地位意味着台式机图形厂商可以集中精力发展单一的编程接口,图形设备接口。这个时期出现的Win G图形接口成为包括PS在内的大批3D软件的支持API,此外有大量游戏,其中之一是风靡美国的首款第一人称视角射击类游戏:Doom。我也在一个提供游戏模拟器的网站体验了这个小游戏,选择难度为中档(hurt me plenty),居然在第二关就被怪物的大火球烧死,得出结论:菜鸟在任何时期都是菜鸟。 OpenGL OpenGL是出现于90年代初的专业图像API,并成为在个人电脑领域上图像发展的主导力量,和硬件发展的动力。虽然在OpenGL的影响下,带起广泛的硬件支持,但在当时用软件实现的OpenGL仍然普遍。 此前我很容易把OpenGL与OpenCV混淆,一个区分方法是,前者将图像显示在计算机上,后者用计算机处理图像。 运用它进行渲染的游戏不计其数,一个著名的例子是B站Up主老番茄的成名之作杀手(HitMan)的首部。 科学计算 到2002年10月,随着ATI Radeon 9700(也称为R300)的推出,世界上第一个Direct3D 9.0加速器,像素和顶点着色器可以实现循环和冗长的浮点数学运算,并且很快变得像CPU一样灵活,但是对于图像阵列操作,速度更快。像素阴影通常用于凹凸贴图,从而增加纹理,使对象看起来发亮,暗淡,粗糙,甚至圆形或挤压。 随着Nvidia GeForce 8系列的推出,GPU成为了更加通用的计算设备。被称为GPU计算或用于GPU上的通用计算的GPGPU的研究子领域已进入机器学习,石油勘探,科学等领域图像处理,线性代数,统计, 3D重建,甚至股票期权定价确定。当时的GPGPU是现在称为计算着色器(例如CUDA,OpenCL,DirectCompute)的先驱,实际上通过将传递给算法的数据视为纹理贴图并通过绘制三角形或四边形来执行算法,从而在一定程度上滥用了硬件使用适当的像素着色器。显然,这会带来一些开销,因为实际上不需要的部件包括扫描转换器之类的部件(三角形操作也不是一件值得关注的事情,除了调用像素着色器外)。 总结上面的概念,是利用GPU卓越的并行计算性能来进行实际上与图像处理无关的数学运算。举个实例,比特币早期通过CPU来获取,而随着GPU通用计算的优势不断显现以及GPU速度的不断发展,矿工们逐渐开始使用GPU取代CPU进行挖矿。 自动驾驶 2019年NVIDIA发布全球最大自动驾驶处理器DRIVE AGX Orin,它的构成正是集成了NVIDIA的下一代GPU架构和Arm Hercules CPU内核,以及新的深度学习和计算机视觉加速器,这些加速器合计每秒可提供200万亿次操作。 参考资料 Graphics processing unit-wiki https://en.wikipedia.org/wiki/Graphics_processing_unit 图形处理器-维基百科… Continue reading GPU概述

CPU概论

任务 综述在计算机发展中两个例子,详细描述当时的技术背景,所描述的对象,总结其特点、进步点、推动计算机技术发展的价值和意义、缺陷及后续技术改进等,鼓励图文并茂。 意义 热点新闻是厂商发布高性能的CPU,内行人士可以感受到不同代际间的发展变化,但外行看到各种参数只是不明觉厉,不知晓其中的突破点与先进性。但正如绪论中让人印象深刻的一个观点:硬件工程师需要理解软件需求以得到研发方向,而软件工程师在理解硬件的基础上能使软件的性能得到最大程度的提升。因此,对CPU进行了解是有必要的,这是本次综述选题的出发点。 技术背景 最初计算机的目的正是为了计算,大多数采用的数制是10进制,即每一位由10个真空管表示。在1949年,轻量化BINAC(Binary Automatic Computer)的诞生使工业界向二进制的方案趋近,不过二进制的具体表示在原码、反码和补码的摇摆中才过度到现代的补码表示。 在计算机发明之初,它的软硬件设计是独特的,即使同一公司生产的不同产品也无法共享程序。因此公司的用户粘性很低,更新换代的优先考虑是价格与性能,而非无法沿用数据的旧产品的下一代。IBM公司注意到这一痛点,新的研发方案致力于打造可以使软件通用的不同性能的产品线,这样可以使用户根据需求变化沿用系列产品,这是IBM 360的诞生契机,也是第一个里程碑式指令集的架构的出现,在后面对CPU特点的论述中,可以看到指令集正是CPU的核心所在。 当然,此时的CPU由于生产工艺与电子器件限制,仍然是巨型的机器,对于IBM 360系列部分产品的相关参数如下表所示: Model Announced[14] Memory size (in (binary) KB) Weight (lbs) Notes 30 Apr 1964 8-64[16] 1700 (770 kg)[17]:2030.1   40 Apr 1964 16-256[18] 1700-2310 (770-1050 kg) depends on memory.[17]:2040.1   50 Apr 1964 64-512[19] 4,700-7,135 (2,100-3,236 kg) depends on memory.[17]:2050.2,2050.4 Supported IBM 2361 Large Capacity Storage (LCS). 20 Nov… Continue reading CPU概论

Matlab计算传感器静态特征参数

任务 对于《传感器检测与技术》中第二章的数据计算题目,需要对系列数据进行处理,可以利用Matlab中的矩阵运算和相关函数快速实现。下面以一道例题进行分析,并最后附上最小二乘法求取拟合直线的相关代码。 题目 设有压力传感器的校准数据列于下表,试求 (1)端基拟合直线; (2)端基线性度; (3)滞环误差; (4)重复性误差(λ=3); (5)准确度。 解答 端基拟合直线 端基拟合是求取传感器线性度的拟合直线中一种,顾名思义,是直接连接输入/输出曲线两端点以得到拟合直线。 但由于题目中提供测量的多组数据,故需要取平均值: 输出: 则两端点分别为(0.0,0.0031)与(5.0,0.9995),相应得出拟合直线Y=A0+KX中的参数值: A0=0.0031 K=(0.9995-0.0031)/(5.0-0.0) 端基线性度 线性度则是通过定义公式进行求取,即实际输入/输出曲线与拟合直线的最大偏差ΔYm与满刻度输出值Yfs的比值,由于题目仅提供散点,则只需选取散点的最大偏差进行计算。 滞环误差 计算正、反行程差距最大偏差与最大输出与满刻度输出值之比 重复性误差 通过贝塞尔公式求取标准差,可以通过matlab中的std()函数实现。 准确度 将上述得到的线性度σL、滞环误差σH与重复性误差σR代入公式即可。 最小二乘法 参考资料 MATLAB中矩阵各列求和,各行求和,所有元素求和 概率统计:MATLAB计算标准差和方差 std 贝塞尔公式与标准偏差