以前、星像切り出し用のコードをPythonで書いたのですが、




Matlab用に少し書き直したので公開します。結果はすでにここ最近の記事で使っているので、これまでに見ている方も多いかと思います。デザインはピンとくる方もいるかと思いますが、スターベース東京のブログの作例の切り出し画像のフォーマットに合わせてあります。

ファイル選択ですが、以前選んだフォルダを覚えるようにしました。以下のページを参考にしました。ありがとうございました。
前回の対応フォーマットはJPEGだけでしたが、今回はMatlabのimreadコマンドでサポートする画像ファイルに対応しています。なので、かなりのフォーマットに対応するはずです。実際に全部試したわけではないので分かりませんが、
  • BMP、JPEG、PNG、CUR、JPEG 2000、PPM、GIF、PBM、RAS、HDF4、PCX、TIFF、ICO、PGM、XWD

に対応するらしいです。天文で関連するのは主にJPG, PNG, TIFFくらいでしょうか。RAWファイルはあまり対応できないのですが、個別にFITS形式だけ対応させておきました。

カラーの8bit、16bitに対応しています。32bitには対応していません。あと、グレー画像は多分ダメです。結果はファイル名に”_cut25”というのが足されて、元のファイル形式と同じ形式(例えばjpgならjpg、tifならtif)に書き出されます。


7bc22bb9_cut


あまり綺麗でないですが、ソースコードです。 コピペして、Matlab上で走らせてみてください。上のような画像が出てくるはずです。簡単なコードなので、各自で希望に応じて適当に書き換えてみてください。3x3マスとかも簡単にできるはずです。

clear; %%% Paramters CS = 300; BW = 5; % File select if ispref('MyPreferences','LastUigetfileFolder') folder = getpref('MyPreferences','LastUigetfileFolder'); if ~ischar(folder) folder = '/Users/'; % for mac. if windows use 'C:\'. end else folder = '/Users/'; % for mac. if windows use 'C:\'. end [file,path] = uigetfile({ '*.*', 'All files(*.*)'}, 'Pick a file','MultiSelect', 'on',folder); if ~isnumeric(path) setpref('MyPreferences','LastUigetfileFolder',path) end % Reading image with size and class (full size) [filepath,name,ext] = fileparts(file); if extractBefore(ext,5) == '.fit' Img = fitsread(fullfile(path, file)); else Img(:,:,:) = imread(fullfile(path, file)); end [y, x, l] = size(Img); if isa(Img,'uint16') cv = 256; else cv = 1; end % Size of ASP-C ay = round(size(Img,1)/1.6); ax = round(size(Img,2)/1.6); % empty cut image CutImg = zeros(5*CS+6*BW, 5*CS+6*BW, 3, class(Img)); % Orange area CutImg(:,:,1) = 235 *cv; CutImg(:,:,2) = 170 *cv; CutImg(:,:,3) = 80 *cv; % Blue Area BA = CS+BW+1:4*CS+5*BW; CutImg(BA,BA,1) = 50 *cv; CutImg(BA,BA,2) = 50 *cv; CutImg(BA,BA,3) = 80 *cv; % Define areas in cut image C = zeros(CS,5); for i = 1:5 C(:,i) = (i-1)*CS+i*BW+1:i*(CS+BW); end % Area in original image IX(:,1) = 1:CS; IX(:,2) = round((x-ax)/2)+1:round((x-ax)/2)+CS; IX(:,3) = round((x-CS)/2)+1:round((x+CS)/2); IX(:,4) = round((x+ax)/2)+1:round((x+ax)/2)+CS; IX(:,5) = x-CS+1:x; IY(:,1) = 1:CS; IY(:,2) = round((y-ay)/2)+1:round((y-ay)/2)+CS; IY(:,3) = round((y-CS)/2)+1:round((y+CS)/2); IY(:,4) = round((y+ay)/2)+1:round((y+ay)/2)+CS; IY(:,5) = y-CS+1:y; % Filling cut image by original cut for i = 1:5 for j = 1:5 if ( ((j==1)||(j==5)) && ((i==2)||(i==4)) ) || ( ((j==2)||(j==4)) && ((i==1)||(i==5)) ) CutImg(C(:,i),C(:,j),:) = 256 *cv; % fill with white else CutImg(C(:,i),C(:,j),:) = Img(IY(:,j),IX(:,i),:); end end end %image(CutImg); if extractBefore(ext,5) == '.fit' fitswrite (CutImg, fullfile(path, [name,'_cut25',ext])); else imwrite (CutImg, fullfile(path, [name,'_cut25',ext])); end




途中からいろいろ簡略化しているのでわかりにくいと思います。% Define areas in cut image以降を、以下のコードに置き換えるとまだわかりやすいかと思います。

% Define areas in cut image C1 = 0*CS+1*BW+1:1*CS+1*BW; C2 = 1*CS+2*BW+1:2*CS+2*BW; C3 = 2*CS+3*BW+1:3*CS+3*BW; C4 = 3*CS+4*BW+1:4*CS+4*BW; C5 = 4*CS+5*BW+1:5*CS+5*BW; % Area in original image IX1 = 1:CS; IX2 = round((x-ax)/2)+1:round((x-ax)/2)+CS; IX3 = round((x-CS)/2)+1:round((x+CS)/2); IX4 = round((x+ax)/2)+1:round((x+ax)/2)+CS; IX5 = x-CS+1:x; IY1 = 1:CS; IY2 = round((y-ay)/2)+1:round((y-ay)/2)+CS; IY3 = round((y-CS)/2)+1:round((y+CS)/2); IY4 = round((y+ay)/2)+1:round((y+ay)/2)+CS; IY5 = y-CS+1:y; % Filling cut image by original cut CutImg(C1,C1,:) = Img(IY1,IX1,:); CutImg(C2,C1,:) = 256 *cv; CutImg(C3,C1,:) = Img(IY3,IX1,:); CutImg(C4,C1,:) = 256 *cv; CutImg(C5,C1,:) = Img(IY5,IX1,:); CutImg(C1,C2,:) = 256 *cv; CutImg(C2,C2,:) = Img(IY2,IX2,:); CutImg(C3,C2,:) = Img(IY3,IX2,:); CutImg(C4,C2,:) = Img(IY4,IX2,:); CutImg(C5,C2,:) = 256 *cv; CutImg(C1,C3,:) = Img(IY1,IX3,:); CutImg(C2,C3,:) = Img(IY2,IX3,:); CutImg(C3,C3,:) = Img(IY3,IX3,:); CutImg(C4,C3,:) = Img(IY4,IX3,:); CutImg(C5,C3,:) = Img(IY5,IX3,:); CutImg(C1,C4,:) = 256 *cv; CutImg(C2,C4,:) = Img(IY2,IX4,:); CutImg(C3,C4,:) = Img(IY3,IX4,:); CutImg(C4,C4,:) = Img(IY4,IX4,:); CutImg(C5,C4,:) = 256 *cv; CutImg(C1,C5,:) = Img(IY1,IX5,:); CutImg(C2,C5,:) = 256 *cv; CutImg(C3,C5,:) = Img(IY3,IX5,:); CutImg(C4,C5,:) = 256 *cv; CutImg(C5,C5,:) = Img(IY5,IX5,:);