Abstract
Matlab做IP是很强,对图像在算法层面有绝对给力的功能,但是对于图像的交互操作不够好。
最好是能够在PhotoShop里面画测试图像,然后在Matlab里设计算法来测试。
本文就是简单介绍一下这两个东西结合起来怎么个用。
这 次 测试的目的是想实现:在ps中画两幅图像,用shape context来对这两幅图像做匹配。
PhotoShop其实也就是提供一个GUI的作用。当然了,PS功能很强大,结合PS的脚本也可以实现很强大的处理功能。
Shape Context代码见[1] 。
1/配置
我的测试环境是:PhotoShop CS3 Extended + MATLAB R2009a。
安装完PS CS3后,安装目录下有一个Matlab目录:
这就是Photoshop Toolbox for MATLAB的目录。
配置方法:在Matlab里把这个目录添加到Path序列中,然后刷新工具箱即可。
配置完成之后,就可以在Matlab的帮助里看到PhotoShop toolbox的帮助项。
Matlab目录里面有一些基本的跟ps交互的函数。这些函数本质上是对PS的脚本做了一个封装。
举个例子psblur.m:
function [] = psblur()
%PSBLUR Run the Blur filter.
%
% Example:
% psblur()
% Build up the JavaScript
pstext = ['var b = "";' ...
'try { ' ...
' app.activeDocument.activeLayer.applyBlur();' ...
' b = "OK";' ...
'}' ...
'catch(e) { ' ...
' b = e.toString();' ...
'}' ...
'b;'];
psresult = psjavascriptu(pstext);
if ~strcmp(psresult, 'OK')
error(psresult);
end
先用pstext构建脚本调用命令,再用psjavascriptu将此命令作为参数调用javascript脚本。所以,鉴于PS脚本的强大,等于是可以实现matlab中对ps的完全操控。
2/用到的几个命令
pslaunch - 打开ps(也可以鼠标打开)
psconfig - 配置图像操作属性
psnewdoc - 在ps中新建图像
psdocnames - 获得ps中所有打开的文件名
pssetactivedoc - 设置活动文件
psgetpixels - 从ps中获取图像的像素
基本就用到了这些命令,很简单,这里,只是把ps作为一个输入的GUI而已。
3/测试流程
这次测试的目的是想实现:在ps中画两幅图像,用shape context来对这两幅图像做匹配。
先把处理的基本单元设置为像素。然后,在Matlab中打开ps,并且新建两幅64x64的图像。
pslaunch;
psconfig('pixels', 'pixels');
psnewdoc(64,64);
psnewdoc(64,64);
在ps里画图,这里我画了两个简单的轮廓:
然后,在matlab中获取这两幅图像的数据:
docs = psdocnames();
pssetactivedoc(docs{1});
im1 = psgetpixels();
pssetactivedoc(docs{2});
im2 = psgetpixels();
我写了一个m文件来对图像进行轮廓检测,并且在轮廓上进行采样。
function samp = select_sample_points(image,N)
%select N sample points from a contour and draw these points on the contour
% Input:
% filename - image file
% N - number of sample points
% Output:
% samp - Nx2 matrix
%
% by visionfans, 26/3/2011
if ischar(image)
BW = imread(filename);
else
BW = image;
end
if ~islogical(BW)
BW = im2bw(BW);
end
[rows,cols] = size(BW);
% select sample points from contour
boundaries = bwboundaries(BW,'noholes');
bd = boundaries{1};
sel = floor(linspace(1,size(bd,1)-size(bd,1)/N,N));
samp = bd(sel,:);
% view sample points
% figure;imshow(BW);
% hold on;
% plot(samp(:,2),samp(:,1),'ro');
% hold off;
% normalize sample points
samp = samp ./ max(rows,cols);
之后,就可以直接用Shape Context[1] 进行匹配了。
4/结果
PS:
更多相关信息请参考:[1 ,2 ,3 ,4 ,5 ,6 ]。
Referrences
[5] MATLAB Photoshop 自述文件.pdf(PS安装目录/Matlab/中)
[6]Adobe Photoshop CS3 Extended + MATLAB 7.0+,http://www.inthemod.com/bps/?p=136