我怎么能将文本添加到一个图像,使文本成为图像在MATLAB的一部分?

348(30天)
我想加几个字符图像。我想要的人物形象的一部分,而不是一个文本对象。

接受的答案

MathWorks支金宝app持团队
编辑:MathWorks支金宝app持团队 2021年2月22日
如果你有计算机视觉系统工具箱,您可以使用“insertText”功能:
例子:
我= imread (“peppers.png”);
J = insertText((100 315),我“辣椒对你有好处!”);
imshow (J);
“insertText”支金宝app持unicode格式。有关更多信息,请参阅以下链接:
如果计算机视觉工具箱不可用,您可以使用以下处理:
你可以显示一个文本和使用GETFRAME函数来捕获文本作为一个图像。然后替换图像像素与像素的文本。下面的代码演示了上面的建议步骤。确保图像和坐标轴对象图中可见窗口执行GETFRAME命令时。
%读例子图像
负载(“clown.mat”);
我= uint8 (255 * ind2rgb (X,地图);
% %创建文本面具
%进行图像大小相同,把文本
高频=图(“颜色”,“白色”,“单位”,“归一化”,“位置”,(。1。1。8。8]);
图像的(大小(im)));
集(gca),“单位”,“像素”,“位置”[5 5大小(im, 2)大小(im, 1) 1),“可见”,“关闭”)
%的文本在任意位置
文本(“单位”,“像素”,“位置”(100 100),“字形大小”30岁的“字符串”,“一些文本”)
%捕获图像的文本
%注意1像素的大小会改变
蒂姆= getframe (gca);
关上(高频)
%提取cdata
tim2 = tim.cdata;
%与负的面具文本
tmask = tim2 = = 0;
%的地方白色文本
%替代面具像素UINT8 max
im (tmask) = uint8 (255);
图像(im);
4评论

登录置评。

更多的答案(4)

迪玛Lisin
迪玛Lisin 2014年6月3日
编辑:迪玛Lisin 2015年9月10日
现在有一个 insertText 计算机视觉系统功能的工具箱将绘制文本。它支持金宝appR2015b unicode字符。

为副总经理
为副总经理 2021年7月15日
编辑:为副总经理 2023年2月12日
做显示捕获似乎是一个可怜的解决方案。建议的方法将失败对于几乎任何大的图像。这文本图像需要生成和填充正确的几何形状和文本的位置……和所有的粗糙的关键是平滑的文本副本。如果你要做显示捕获,至少保留抗锯齿。
%工艺参数
textstring =“看看这些岩石的;
字形大小= 100;%在像素,而不是点
操作系统= (900 - 300);%抵消
输入textcolor = (85 250 118);
inpict = imread (“parkavenue.jpg”);
s =大小(inpict);
%创建一个文本图像基础上席子认为足以将文本
%这只是一个快速的想我。我不知道的一个好方法
%预测变量的输出尺寸宽度字体
高频=图(“单位”,“归一化”,“位置”,(0 0 1 1));
imshow(的字形大小* 3,字形大小*元素个数(textstring)));
tt =文本(“单位”,“像素”,“位置”,(字形大小字形大小),“fontunits”,“像素”,
“字形大小”字形大小,“字符串”,textstring);
tpict = getframe (gca);
tpict = tpict.cdata;
%作物的基本文本对象,反转,垫图像大小
ttpos =圆(tt.Extent);关上(高频)
ttpos大小(2)= (tpict, 1) -ttpos (2);
tpict = tpict (ttpos (2) -ttpos (4): ttpos (2), ttpos (1): ttpos (1) + ttpos (3));
tpict = imcomplement (im2double (tpict));
圣=大小(tpict);
如果圣(2)> s (2)
错误(“文本太大适合% dpx > % dpx '圣(2),(2))
elseif(操作系统(2)+圣(2))> s (2)
错误(“文本太大符合给定的偏移量(% dpx + % dpx) > % dpx '操作系统(2),圣(2),(2))
结束
tpict = padarray (tpict,操作系统,0,“以前”);
tpict = padarray (tpict s (1:2)——(os +圣),0,“职位”);
%生成一个彩色的领域
cpict = (s (1:2))。*排列(输入textcolor [1 3 2]);
%复合的图像
outpict =双(inpict)。* (1-tpict) +双(cpict)。* tpict;
outpict = uint8 (outpict);
imshow (outpict)
上面的代码并不是牢不可破的,特别是由于所需的文本席子大小的估计。它也将失败,如果文本块太大了,呈现在屏幕上。至少这证明了概念和保留了抗锯齿,因为它使用线性混合。
FEX提交 丹尼尔·沃伦有其缺点,但可能是一个更好的基础概念方法利用图捕获文本插入。
有别的吗?
我想它真的取决于需求和期望是什么。有很多文本图像文件交换工具。结果是一个小图像的文本。结合到任何图像应该是一个简单的任务。一些人支持平滑输出金宝app适合线性混合像上面的例子。别人只支持二进金宝app制输出,有不同的效用,可以允许合成简单的屏蔽。
例如,使用textim()从MIMT(二进制掩蔽):
%工艺参数
textstring =“土豆”;
操作系统= (150 - 150);%抵消
输入textcolor = (250 100 220);
%注意,这是一个灰度图像RGB
%还指出,这些操作假定uint8形象
inpict = repmat (imread (“coins.png”),[1 1 3]);
如果=大小(inpict);
tt = textim (textstring,“ibm-vga-16x9”);
圣=大小(tt);
m = 0 (si (1:2));
米(操作系统(1)+(1:圣(1))、操作系统(2)+(1:圣(2)))= tt;
outpict = inpict;
outpict (repmat(逻辑(m),[1 1大小(inpict, 3)])) = 0;
outpict = outpict + uint8 (m。*排列(输入textcolor [1 3 2]));
imshow (outpict)
MIMT还有其他的工具,可以简化定位/合成,但这个例子是广义除了textim()调用。
FEX上是什么?
MIMT既有textim()和textblock(),产生紧凑的图像文本传统硬件字体。(基于CP437)
text2im()的托拜厄斯基斯林是相似的,但只能够一个字体(此句使用的默认字体MIMT textim())(也基于CP437)
text2im里克提供少量的现代字体风格,尽管它支持一个小字符集,需要网络连接。金宝app //www.tatmou.com/matlabcentral/fileexchange/75021-text2im
由亚历克·雅各布森text_to_image更加灵活,但使用Imagemagick(外部依赖性),因此慢。
也有其他人:
也有稍微不同的方法:

Lockywolf
Lockywolf 2016年3月13日
insertText函数是极其缓慢的,不幸的是,每0.04秒的电话。
~ 1.5秒40对象。
我真的很喜欢一些建议关于如何提高速度。
1评论
测试测试
测试测试 2016年3月14日
如果你使用相同的字体和字体大小为所有对象可以获得更好的性能。如果不提高速度,你能提供以下信息:
(1)MATLAB您正在使用的版本
(2)调用insertText函数的代码片段

登录置评。


ElizabethMeng
ElizabethMeng 2016年11月23日
这对我来说不起作用……获得的数据的大小getframe从来都不是正确的。
3评论
为副总经理
为副总经理 2023年2月12日
我发现的行为getframe()通常是不可预测的和不一致的版本之间的(也许是依赖环境)。我发现它有助于避免 总值 几何变化如果你叫drawnow getframe之前()(),但即便如此,你应该期待你的图片是不正确的大小和/或包含无关的填充。如果没有,那么恭喜你。

登录置评。

MathWorks支金宝app持

下载188bet金宝搏

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!