如何从DrawFormattedText获取像素信息

时间:2015-08-06 14:29:57

标签: matlab psychtoolbox

我使用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函数生成的内容。

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

感谢您提供的任何帮助!

2 个答案:

答案 0 :(得分:0)

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

版本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告诉我们该图像的三个层是R的G和RGB颜色空间的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

只需将其加总两次即可知道包含多少像素。

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

答案 1 :(得分:0)

从@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)

我不确定在所有情况下这是多么可靠,但是为了比较以相同字体大小等呈现的不同单词,我假设它应该有效。我很想知道是否有人对这种方法有特别的批评(或者更好,更好的解决方案!):)

非常感谢!