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);else rmdir(path,\'s\'); mkdir(path);end%把图像转换成灰度图像X=rgb2gray(original_picture);%把RGB图像转化成灰度图像t = [];%figure(1)[h w] = size(X);%title(\'原始图像\');for k=1:8 for i=1:h for j=1:w tmp(i,j) = bitget(X(i,j),k);%bitget函数首先将X(i,j)处灰度值分解为二进制串,然后取第k位 end end subplot(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);else rmdir(wr_path,\'s\'); mkdir(wr_path);endprefix = \'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);else rmdir(path,\'s\'); mkdir(path);end% 生成图像并保存img_cnt = 8000;%循环次数控制for index = 1 : img_cnt cla(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<10 text(800,500,num2str(index),\'Color\',\'black\',\'FontSize\',500); elseif index<100 text(600,500,num2str(index),\'Color\',\'black\',\'FontSize\',500); elseif index<1000 text(400,500,num2str(index),\'Color\',\'black\',\'FontSize\',500); elseif index<10000 text(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); else rmdir(path,\'s\'); %这将导致目录无法恢复,因此要谨慎使用 mkdir(path); end imwrite(img, strcat(path, prefix, suffix),format);
6.传送门
- 我的主页
- FPGA开发必备技能专栏汇总导航
- 上一篇:FPGA开发技能(11)用iperf测试网络性能
💎文章原创,首发于CSDN论坛。
💎欢迎点赞💖收藏✨打赏💷!
💎欢迎评论区🎤或私信指出错误🎤,🗣️提出宝贵意见或疑问。