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 |
|