当前位置: 首页 > news >正文

FPGA开发技能(12)matlab图片处理助力FPGA开发

在这里插入图片描述

文章目录

  • 1.使用matlab对原始图片灰度化、二值化
  • 2.使用matlab提取8bit灰度的位图并显示
  • 3. 使用matlab批量修改图片分辨率
  • 4.使用matlab批量生成特定分辨率的“数字升序”图片
  • 5.使用matlab生成特定分辨率的、特定文字的图片
  • 6.传送门

1.使用matlab对原始图片灰度化、二值化

当需要查看一张标准格式如png jpg的图片灰度化二值化的效果的时候,使用matlab非常方便。主要用到的函数是rgb2gray进行灰度化处理了,im2bw进行二值化处理。其代码和效果如下:

%读取一张图片,并显示
original_picture=imread('替换自己的路径');
figure(1);
imshow(original_picture);
title('原始RGB图像')
%把图像转换成灰度图像
GrayPic=rgb2gray(original_picture);%把RGB图像转化成灰度图像
figure(2)
imshow(GrayPic);
title('RGB图像转化为灰度图像')
%对图像进行二值化处理
thresh=graythresh(original_picture);%graythresh为自动确定二值化阈值函数,大于该阈值的就变成白色,小于该阈值的就变成黑色,所以阈值越大越黑,阈值越小越白
Pic2=im2bw(original_picture,thresh);%如果想要自己设定阈值,那么就可以这样写Pic2=im2bw(original_picture,value);,value=[0,1]中间的任何数值
figure(3);
imshow(Pic2);
title('RGB图像转化为二值化图像')
thresh=graythresh(GrayPic);
Pic2_=im2bw(GrayPic,thresh);
figure(4);
imshow(Pic2_);
title('灰度图像转化为二值化图像')

在这里插入图片描述

2.使用matlab提取8bit灰度的位图并显示

实际项目中,需要下位机处理8bit灰度图,将其每一个位图提取出来,然后通过某种特定的灰度调制算法将这些位图“积分”显示,呈现灰度效果。为了验证下位机处理结果是否正确,可以通过matlab显示各位平面,与下位机处理后的位平面对比。主要使用的是bitget函数,它可将X(i,j)处的灰度值分解成二进制,然后取第K位,形如tmp(i,j) = bitget(X(i,j),k);其matlab代码如下:

%读取一张图片,并显示
original_picture=imread('替换成自己的路径');
path = '自己的位置'; % 保存的文件夹位置
prefix = 'image_'; % 文件名前缀
format = 'png'; % (图片)文件格式
suffix = strcat('.',format); % 文件后缀
% 如果目录不存在则新建,否则删除文件夹并新建
if ~exist(path,'dir')mkdir(path);
elsermdir(path,'s');mkdir(path);
end
%把图像转换成灰度图像
X=rgb2gray(original_picture);%把RGB图像转化成灰度图像
t = [];
%figure(1)
[h w] = size(X);
%title('原始图像');
for k=1:8for i=1:hfor j=1:wtmp(i,j) = bitget(X(i,j),k);%bitget函数首先将X(i,j)处灰度值分解为二进制串,然后取第k位endendsubplot(3,3,k+1);%图像显示位置imshow(tmp,[]);ind = num2str(k);imti = ['第',ind,'个位平面'];title(imti);a =mat2gray(tmp) ;imwrite(a, strcat(path, prefix,ind, suffix),format);
end

在这里插入图片描述

3. 使用matlab批量修改图片分辨率

项目实践中,找了一组图片用于某设备测试,但该设备要求图片分辨率只有一种格式才能下发。因此使用matlab创建一个应用,将统一文件夹中的所有图片修改成特定分辨率输出。主要是通过imgresize函数完成分辨率修改,添加循环完成对文件夹中图片序列的处理。使用的时候把rd_path改为要读取图片的文件夹,wr_path改为要保存的文件夹位置,根据图片个数修改for循环的范围,代码中,待修改的图片序列的格式是jpg。代码如下:

rd_path = '读取的文件夹位置'; % 
wr_path = '保存的文件夹位置'; % 
% 如果目录不存在则新建,否则删除文件夹并新建
if ~exist(wr_path,'dir')mkdir(wr_path);
elsermdir(wr_path,'s');mkdir(wr_path);
end
prefix = 'pic000_'; % 文件名前缀
format = 'jpg'; % (图片)文件格式
suffix = strcat('.',format);
for i = 1:10 %10张照片
X=imread(strcat(rd_path, prefix, num2str(i), suffix));
FO=imresize(X,[600,1024]);
imwrite(FO,strcat(wr_path, prefix, num2str(i), suffix),format);
end

4.使用matlab批量生成特定分辨率的“数字升序”图片


实际项目需求,生成几千张白底黑字的数字升序的图片序列,作为某显示设备的测试序列。第一张图片是数字1,第二张是数字2,以此循环。显然这样的工作使用画图软件相当繁琐,效率低,使用matlab还是很方便。参考使用matlab生成特定分辨率的、特定文字的图片,无非添加了两个动作,一是由于批量生成故需要循环。二是写入图片的文字要根据当前循环变量的值修改,由于数字1和数字10的大小不一样,因此文字写入图片的位置也要修改。仅此而已,Matlab脚本源码如下。

% Introduction
% 按需求生成多张图片并保存到指定文件夹下
% 生成8000张1280*800(w*h)的png图片并按顺序保存在image文件夹下
path = 'location/'; % 保存的文件夹位置
prefix = 'image_'; % 文件名前缀
format = 'png'; % (图片)文件格式
suffix = strcat('.',format); % 文件后缀% 如果目录不存在则新建,否则删除文件夹并新建
if ~exist(path,'dir')mkdir(path);
elsermdir(path,'s');mkdir(path);
end
% 生成图像并保存
img_cnt = 8000;%循环次数控制
for index = 1 : img_cntcla(gcf);%下一次循环时清空figure% gcf 返回当前Figure 对象的句柄值
% gca 返回当前axes轴 对象的句柄值 作图区域rect = [0,0,2560,1600];   % 确定画图区域的位置,即指定的分辨率set(gcf,'unit','pixels','position',rect);set(gca,'unit','pixels','position', rect);% 设定单位为像素set(gcf, 'color', 'w');         % 背景颜色为白色set(gca, 'xtick', [], 'ytick', []); %同时去掉x轴和y轴的刻度axis off;  %去掉坐标轴xlim([0 2560]);%调整横轴坐标ylim([0 1600]);%调整纵轴坐标if index<10text(800,500,num2str(index),'Color','black','FontSize',500);elseif index<100text(600,500,num2str(index),'Color','black','FontSize',500);elseif index<1000text(400,500,num2str(index),'Color','black','FontSize',500);elseif index<10000text(200,500,num2str(index),'Color','black','FontSize',500);end
%     text(200,500,'2154','Color','black','FontSize',500);img = getframe(gcf);img = imresize(img.cdata,[1600 2560]);   imwrite(img, strcat(path, prefix, num2str(index), suffix),format);
end

5.使用matlab生成特定分辨率的、特定文字的图片

项目实际应用中,需要制作一张白底黑字指定分辨率大小的图片作为logo。可以使用画图工具完成这一操作,但使用matlab完成也是非常方便的。通常把解决某一问题需要的步骤称之为算法,对于这个问题按照计算机思维需要分三步,①指定一张白图,大小为指定分辨率大小。②按照想要填入的文字信息,在图中有字的地方显示黑色。③将图片保存成png或其他格式,“输出”(指文件操作)。那结合matlab的语法和编程习惯,上述通用的计算机编程思路变成了①使用figure作为白图,由此需要使用set函数调整白图长和宽的单位为像素,去掉默认的坐标轴,并将图片调整成特定分辨率大小。(为做到与通用编程思路对应,将多个动作结合到一个步骤中。)②使用text函数,在当前白图指定位置写入指定“文字”。③通过getframe获取当前图窗返回图片,并通过imwrite指定格式与路径做文件输出操作即可。
​​​​​​​​​​​​​​Matlab脚本源码如下,初学者可结合代码注释和上述描述感受编程思维的微妙差别和乐趣。关于各函数的作用注释已有好的说明。

% Introduction
% Function: 生成指定分辨率大小的ABCD 
% 生成图像并保存cla(gcf);%下一次循环时清空figure% gcf 返回当前Figure 对象的句柄值% gca 返回当前axes轴 对象的句柄值 作图区域rect = [0,0,2560,1600];   % 确定画图区域的位置,即指定的分辨率set(gcf,'unit','pixels','position',rect);%set(H,Name,Value) 为H标识的对象指定其 Name 属性的值set(gca,'unit','pixels','position', rect);% 设定单位为像素set(gcf, 'color', 'w');         % 背景颜色为白色set(gca, 'xtick', [], 'ytick', []); %同时去掉x轴和y轴的刻度axis off;  %去掉坐标轴xlim([0 2560]);%调整横轴坐标ylim([0 1600]);%调整纵轴坐标text(550,500,"ABCD",'Color','black','FontSize',400, 'FontWeight', 'bold');%指定位置输出文本信息set(gca,'Box','off');%去掉右上角鼠标等标识img = getframe(gcf);%F = getframe 捕获显示在屏幕上的当前坐标区作为影片帧img = imresize(img.cdata,[1600 2560]);  path = 'test/'; % 保存的文件夹位置prefix = 'image_'; % 文件名前缀format = 'png'; % (图片)文件格式suffix = strcat('.',format); % 文件后缀% 如果目录不存在则新建,否则删除文件夹并新建if ~exist(path,'dir')mkdir(path);elsermdir(path,'s'); %这将导致目录无法恢复,因此要谨慎使用mkdir(path);endimwrite(img, strcat(path, prefix, suffix),format);

6.传送门

  • 我的主页
  • FPGA开发必备技能专栏汇总导航
  • 上一篇:FPGA开发技能(11)用iperf测试网络性能
END

💎文章原创,首发于CSDN论坛。
💎欢迎点赞💖收藏✨打赏💷!
💎欢迎评论区🎤或私信指出错误🎤,🗣️提出宝贵意见或疑问。


http://www.dtcms.com/a/355353.html

相关文章:

  • 【温室气体数据集】GlobalView 数据概述
  • Kotlin 协程之Channel 的高阶应用
  • RAGFlow
  • plantsimulation知识点 一条轨道上多台RGV如何引用
  • 【Big Data】Presto db 一种语言、一个接口搭建可靠、高效数据湖仓
  • NineData 最新发布 SQL Server 双向实时同步功能
  • 手机上访问你电脑上的前端项目
  • Rust 登堂 之 类型转换(三)
  • 趣味学Rust基础篇(数据类型)
  • Python Discord Logo
  • 【SpringAI】快速上手,详解项目快速集成主流大模型DeepSeek,ChatGPT
  • 操作系统-基础知识面试常见篇
  • 算法之排序
  • java后端的各种注解
  • 基于 PyTorch 构建 Dataset 与 DataLoader:从 TXT 文件读取到新增类别全流程指南
  • AI大模型企业落地指南-笔记02
  • Spring 框架中事务传播行为的定义
  • 146. LRU缓存
  • python使用sqlcipher4对sqlite数据库加密
  • 【论文阅读】基于人工智能的下肢外骨骼辅助康复方法研究综述
  • 【电源专题】隐形守护者:防爆锂电池如何守护高危环境的安全防线
  • UE5提升分辨率和帧率的方法
  • 网站日志里面老是出现{pboot:if((\x22file_put_co\x22.\x22ntents\x22)(\x22temp.php\x22.....
  • Leetcode 深度优先搜索 (15)
  • 【大前端】React Native(RN)跨端的原理
  • 比较两个字符串的大小
  • 使用CDN后如何才不暴露IP
  • EtherNet/IP 转 Modbus 协议网关(三格电子)
  • SOME/IP-SD通信中的信息安全保证
  • leetcode_73 矩阵置零