14
2

画像をExcelにするMATLAB術

Last updated at Posted at 2023-12-24

目次

はじめに
画像を読み込む
列番号をExcelに対応させる
背景色番号を抽出
Cell型に変換
MATLABからExcelを操作しよう
使用した関数
数字をExcelの列に対応する関数
背景を塗りつぶす関数
結果
おわりに

はじめに

こんにちは、HerniaBabyです。

皆さんExcel大好きですよね?世間ではネ申Excelといわれるものが世の中にはびこるくらい日本人はExcel大好きだと思っています。

もはやExcelは和の心、大和魂…。

そんなわけで今回は画像を別の形式に変換するクソアプリをMATLABでやっていきたいと思います。

画像を読み込む

まずは画像を読み込みましょう。

このときに方眼に色を書き込むんですが、画像がデカいとずっと計算が終わらないのでimresizeで小さくしていきます。

clc,close all,clear;
I = imread('chacha.jpeg');
I = imresize(I,[150 150]);
imshow(I)

figure_0.png

画像は愛犬チャチャです。かわいいね( *´艸`)

ここで画像の範囲を抜き出します。

[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型で出してます。

ExcelはBGRなので注意してください
How to set excel cell color to red from Matlab?

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 ファイルのセル幅自動調整)にあったんですよね。高さが…。

ちなみに正方形の調整は以下を参考にしました。

Excelの技:すべてのセルを正方形にして方眼紙のように!

range = ImgString(1,1)+":"+ImgString(end,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]; %#ok<AGROW>
        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

結果

けっこうよくないですか?!

image_0.png

アップするとこんな感じです↓

image_1.png

てことで完成です。

おわりに

今回は業務に関連するものではなく気ままに作りました。

応用すると昔流行ったExcelでBadAppleなんかも出来そうですね。

cellfun使ったんですがやり方が悪いのか計算が遅いんですよね。

誰か行列を指定して一気に背景色反映させる方法知りません?

知ってたら教えてください。

2023.12.07追記
MATLAB Answersでも聞いてみましたが、値(Value)のみが一括で変更できるみたいです。
MATLABからEx​celの背景色を一括​で変えたい

2023.12.11追記
目次でアルファベット入れる場合はリンクのものを小文字にする必要があるんですね。
目次にアルファベットを打っても効果なしですか?

2023.12.11追記
GitHubにも掲載しました。
何気に初めてやりました。

14
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
2