文章目录
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);
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);
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.传送门
END |
💎文章原创,首发于CSDN论坛。
💎欢迎点赞💖收藏✨打赏💷!
💎欢迎评论区🎤或私信指出错误🎤,🗣️提出宝贵意见或疑问。