我如何从DrawFormattedText获得像素信息



我使用函数DrawFormattedText在Psychtoolbox中呈现文本。我想知道如何从这个函数中计算文本产生的像素数。

一个最小的例子看起来像这样(你应该能够复制/粘贴它):
[w, wRect]=Screen('OpenWindow', 0, [0 128 128],[],[],[],[],128);
Screen('TextFont',w, 'Arial'); %Set font
Screen('TextSize',w, 16); %Set text size
[nx, ny, bbox] = DrawFormattedText(w, 'HowManyPixelsDoIHave?', 'center', 'center', 60);
Screen('Flip',w);
KbWait; %Wait for response before closing
Screen('CloseAll');

在这个例子中,我想找出有多少像素被用来写文本"HowManyPixelsDoIHave?"我需要一个度量来比较各种打印文本字符串。

我似乎没有把握如何访问由DrawFormattedText函数产生的内容。

整个屏幕及其像素值的矩阵就足够了。如果有人知道如何将其缩小到屏幕的特定区域,我将不胜感激。

谢谢你能提供的任何帮助!

提取像素实际上很容易。我不确定你是否想要的信息需要多少空间的文本做显示,或者你想要的信息,例如,多少黑色像素的字母B包含。

版本1 -我需要多少空间

所有信息都存储在bbox变量中。bbox包含定义文本打印的矩形的点。

您可以通过在命令行中输入bbox来获取这些值。输出应该如下所示:

>> bbox
bbox =
   1592    517   1770    533

您可以通过以下方式获得单个值:

bbox(1) % x left
bbox(2) % y top
bbox(3) % x right
bbox(4) % y botom

这是你的问题的代码

 [w, wRect]=Screen('OpenWindow', 0, [0 128 128],[],[],[],[],128);
Screen('TextFont',w, 'Arial'); %Set font
Screen('TextSize',w, 16); %Set text size
[nx, ny, bbox] = DrawFormattedText(w, 'HowManyPixelsDoIHave?', 'center', 'center', 60);
Screen('Flip',w);
KbWait; %Wait for response before closing
Screen('CloseAll');
pixelWidth  =  bbox(3) - bbox(1) %x
pixelHeight = bbox(4) - bbox(2) %y

pixelWidth包含为x轴打印整个文本(包括空白)所需的像素数。pixelHeight在y轴上做同样的事情。

我认为你应该看看一些matlab/octave基础知识,访问向量的特定元素很容易学习,而且非常重要。

版本2 -字母B需要多少黑色像素

有一个名为Screen('GetImage',的函数,它将当前屏幕保存到一个变量中。对于这个建议,我们创建一个100 * 100像素大的窗口。因此,如果我们保存我们的窗口,我们得到一个100*100*3图像作为一个变量。*3告诉我们,该图像有三层,分别是RGB色彩空间的R、G和B值。RGB的取值范围是0到255。

我们所做的是打开一个黑色[0 0 0]背景的窗口,并在该屏幕上用稍亮的黑色[1 1 1]书写。当我们现在用Screen('GetImage',保存窗口的时候你会得到这样的第一个图层image(:,:,1):

  0  0  0  0  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0  0  0  0  0
  0  0  0  1  1  1  1  1  1  1  0  0  0  0
  0  0  0  1  0  0  0  0  0  0  1  0  0  0
  0  0  0  1  0  0  0  0  0  0  0  1  0  0
  0  0  0  1  0  0  0  0  0  0  0  1  0  0
  0  0  0  1  0  0  0  0  0  0  1  0  0  0
  0  0  0  1  1  1  1  1  1  1  1  0  0  0
  0  0  0  1  0  0  0  0  0  0  1  0  0  0
  0  0  0  1  0  0  0  0  0  0  0  1  0  0
  0  0  0  1  0  0  0  0  0  0  0  1  0  0
  0  0  0  1  0  0  0  0  0  0  0  1  0  0
  0  0  0  1  0  0  0  0  0  0  1  0  0  0
  0  0  0  1  1  1  1  1  1  1  0  0  0  0
  0  0  0  0  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0  0  0  0  0

把它们加起来2次,你就知道包含了多少像素了。

WINDOWSIZE = [100 100 200 200]
[w, wRect]=Screen('OpenWindow', 0, [0 0 0] ,WINDOWSIZE );
Screen('TextFont', w, 'Arial'); %Set font
Screen('TextSize',  w, 16); %Set text size
Screen('TextColor', w  ,[1 1 1]); % rgb for the textfont displays 1
[nx, ny, bbox] = DrawFormattedText(w, 'Ban', 'center', 'center' );
Screen('Flip',w);
ban = Screen('GetImage', w);
KbWait; %Wait for response before closing
[nx, ny, bbox] = DrawFormattedText(w, 'San', 'center', 'center' );
Screen('Flip',w);
san = Screen('GetImage', w);
KbWait; %Wait for response before closing
Screen('CloseAll');
pixelsum_san= sum(sum(san(:,:,1)))
pixelsum_ban =sum(sum(ban(:,:,1)))

结果如下:

pixelsum_san =  79
pixelsum_ban =  90

根据@wuschLOR的回答推断:

要获得屏幕内容的3D数组,我使用:

IM = Screen('GetImage',w);

然后从每个维度的矩阵中减去(绝对)每个维度的背景值:

bgcolour = [0, 128, 128];
for l = 1:size(IM,3)
    nobgval(l) = sum(sum(abs(double(IM(:,:,l))-bgcolour(l))));
end

然后我将其相加以获得屏幕内容与背景的不同程度的"度量":

pixelmetric = sum(nobgval)

我不确定这在所有情况下有多可靠,但对于比较以相同字体大小呈现的不同单词等,我假设它应该工作。我很乐意听到是否有人对这种方法有具体的批评(或者更好,更好的解决方案!):)

多谢!

相关内容

  • 没有找到相关文章

最新更新