MATLAB Online で開くにはこちらをクリック!
File Exchangeにも投稿しました。
画像をExcelにするMATLAB術
目次
はじめに
こんにちは、HerniaBabyです。
皆さんExcel大好きですよね?世間ではネ申Excelといわれるものが世の中にはびこるくらい日本人はExcel大好きだと思っています。
もはやExcelは和の心、大和魂…。
そんなわけで今回は画像を別の形式に変換するクソアプリをMATLABでやっていきたいと思います。
画像を読み込む
まずは画像を読み込みましょう。
このときに方眼に色を書き込むんですが、画像がデカいと反映されないみたいなのでimresizeで小さくしていきます。
色の制限もあるっぽいですが、今回はめんどくさいので減色もしません。
反映されない理由
Excel で「異なるセル形式が多すぎます」というエラー メッセージが表示される
clc, close all, clear;
I = imread('chacha_sq.jpeg');
I = imresize(I,[150 150]);
imshow(I)
画像は愛犬チャチャです。かわいいね( *´艸`)
行番号と列番号を抽出します。
[row, col] = size(I,1,2);
列番号をExcelに対応させる
Excelは列がA...AA...AAAのような英語になっています。
列番号をこれに対応させる必要があります。
MATLABで数字をExcelの列名に変換でMATLABアンバサダーの方が紹介してくれてますが、今回はMATLAB Answersのものを拾って使ってます。
I need to convert a number into its column name equivalent
col_e = arrayfun(@int2xlcol, (1:col));
ImgString = col_e + string((1:row)');
背景色番号を抽出
RGB値を抜き出してExcelで使えるようにします。
最初は Cody を参考にHex Stringに直してたんですが、結局hex2decに直してたのでそのままdouble型で出してます。
How to set excel cell color to red from Matlab?
※ExcelはBGRなので注意してください。
I_d = im2double(I);
[R,G,B] = imsplit(I_d);
bgrColor = (B.*256^2 + G.*256 + R).*255;
Cell型に変換
forループを使うとMATLABフリークスがマジギレするのでcellfunを使います。
そのためcell配列に変換します。
ImgCells = cellstr(ImgString);
bgrColorCell = num2cell(bgrColor);
MATLABからExcelを操作しよう
こいつのドキュメント本当に少なくて苦労しました。
MathWorksさん!Excelは大和魂ぞ?!充実させてください(白目)
今回は色んなところからかき集めたので説明していきます。
まずはパスを指定します。
%Obtain the full path name of the file
filePath = fullfile(pwd, 'Book1.xlsx');
ExcelをActiveXで起動させます。
%Open an ActiveX connection to Excel
h = actxserver('excel.application');
Excelファイルを開きます。
%Open an excel file
wb = h.Workbooks.Open(filePath,0,false);
ここで各セルに背景色を書き込みます。
cellfun(@(x,y) xlscolor(h, x, y), ImgCells, bgrColorCell)
行の高さと列の幅を正方形にします。
ハンドルプロパティどこあるのか苦労しました。
列幅はQiita(【MATLAB】Excel ファイルのセル幅自動調整)にあったんですよね。高さが…。
ちなみに正方形の調整は以下を参考にしました。
range = ImgString(1)+":"+ImgString(end);
wbrange = wb.ActiveSheet.get('Range',range);
wbrange.EntireColumn.ColumnWidth = 1.88;
wbrange.EntireRow.RowHeight = 15;
最後に上書き保存してExcelを閉じます。
% save the file with the given file name, close Excel
wb.Save;
wb.Close;
h.Quit;
h.delete;
disp('完了')
完了
使用した関数
数字をExcelの列に対応する関数
function str = int2xlcol(num)
raw = 'A':'Z';
str = raw(1+rem(num-1,26));
tmp = fix((num-1)/26);
while any(tmp)
str = [raw(1+rem(tmp-1,26)),str];
tmp = fix((tmp-1)/26);
end
str = string(str);
end
背景を塗りつぶす関数
function xlscolor(h, range, Color)
ran = h.Activesheet.get('Range',range);
ran.interior.Color = Color;
end
結果
けっこうよくないですか?!
アップするとこんな感じです!
てことで完成です。
おわりに
今回は業務に関連するものではなく気ままに作りました。
応用すると昔流行ったExcelでBadAppleなんかも出来そうですね。
cellfun使ったんですがやり方が悪いのか計算が遅いんですよね。
誰か列指定して一気に背景色反映させる方法知りません?
知ってたら教えてください。
引用
Hernia Baby (2024). Image2Excel (https://github.com/HerniaBaby/Image2Excel), GitHub. に取得済み.
MATLAB リリースの互換性
プラットフォームの互換性
Windows macOS Linuxタグ
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!GitHub の既定のブランチを使用するバージョンはダウンロードできません
バージョン | 公開済み | リリース ノート | |
---|---|---|---|
1.0.0 |
|