FaceAlphaを考慮した色の取得

61 vues (au cours des 30 derniers jours)
gafakel
gafakel le 5 Sep 2023
Commenté : Hiroshi Iwamura le 13 Sep 2023
お世話になっております。
今、次のようにfigureを作成し、またPatchを実行したとします。
figure(100)
plt=plot(0.5,2.5,"o","MarkerFaceColor",[0.2500 0.0600 0.2900],"Color",[0.2500 0.0600 0.2900],"MarkerSize",18);
pat=patch([1,1,3,3],[0,2,2,0],[0.2500 0.0600 0.2900],"FaceAlpha",0.3);
axis([0 3 0 3])
set(gca,"XTick",[0 3])
set(gca,"YTick",[0 3])
grid on
ここで、pltとpatには同じ色(紫)を与えています。ですがpatの方は透明度が0.5であるため少し透明になっており、見た目では少し薄い紫色に見えます。
このとき、このpatとして表示されている色をRGB3要素として取得する方法はありますでしょうか?これは、この今見えているpatの色をpltやrectangleなど、「透明度を設定できないもの」でも使用したいと考えているためです。
とりあえずuisetcolorを使ってウィンドウを開き、目で見比べてそれっぽい色を取ることは思いついたのですが……何か策があればご教示いただけますと幸いです。
よろしくお願いいたします。
  2 commentaires
gafakel
gafakel le 5 Sep 2023
質問させていただいてから気付いたのですが、rectangle関数で出力した四角形はfacealphaがないものの、annotationのオブジェクトとしてrectangleを指定すればfacealphaが設定できるのですね。
annotation関数を失念していたのですが、やろうとしていたのはtext関数で文字を出し、その下にrectangle関数を出して「text関数での文字を四角で囲む」ことでした(text関数のbackgroundcolorもありだったのですが、囲みをどうしても正方形にしたかったのでやめました)。annotationなら、これは達成できそうですね(これから試してみます)
ただplot等ではどうやればいいのか全くピンときません。スポイトみたいなものが使えると嬉しいのですが……ご教示いただけましたら幸いです。
gafakel
gafakel le 13 Sep 2023
皆さまご回答いただきありがとうございました!気付いたら1週間ほど経ってしまっておりました……返信等々遅れて申し訳ありません。
個人的にちょっとした計算が好きなのと、「できたらいいな」と思っていたためIwamura様のご回答を採用させていただきました。ただ、第4要素への代入やスポイトソフト、またイメージデータとしてのキャプチャなど、大変参考になるご回答をいただき、心より感謝を申し上げます。
重複しますが、本当にありがとうございました!

Connectez-vous pour commenter.

Réponse acceptée

Hiroshi Iwamura
Hiroshi Iwamura le 5 Sep 2023
Modifié(e) : Hiroshi Iwamura le 5 Sep 2023
あるいは透明度から自分で計算するかですね
alpha = 0.2;
mColor = [0.2500 0.0600 0.2900];
plt=plot(0.5,2.5,"o","MarkerFaceColor",mColor,"Color",mColor,"MarkerSize",18);
pat=patch([1,1,3,3],[0,2,2,0],mColor,"FaceAlpha",alpha);
axis([0 3 0 3]);
bkColor = gca().Color;
alphaColor = mColor * alpha + bkColor * (1 - alpha);
plt.MarkerFaceColor = alphaColor;
  2 commentaires
gafakel
gafakel le 13 Sep 2023
ご回答ありがとうございます!
お恥ずかしながら、透明度から色の計算ができることをご教示いただくまで知りませんでした……(回答を拝見してから自分でもググってみたら普通に出てきました、お恥ずかしい限りです)。
個人的に「普通に計算出来たらいいのになぁ」と思っていたので、とてもありがたいです!ありがとうございます。実際に使うときははじめから計算してしまっても大丈夫そうですね(個人的に背景を白しか使わないため)。
また、少し逸れますが"gca().Color"で背景色が取得できるのも知らなかったため、大変参考になりました。"( )"が大事ですね……(以前"gca.Color"とやって出来なかったため、これまでいちいち"ax=gca; ax.Color"のように指定していた)。
Hiroshi Iwamura
Hiroshi Iwamura le 13 Sep 2023
お役に立てたようで良かったです。
gca は関数なので、() が必要になります。
一般的には、ax.Color で良いと思います。

Connectez-vous pour commenter.

Plus de réponses (2)

交感神経優位なあかべぇ
plotもrectangleも、color配列の4要素目に、透明度が入力できます。
plot([0,1],[0,1],'Color', [0.2500 0.0600 0.2900 0.3]);
hold on;
rectangle('Position', [0,0,0.5,0.5], 'FaceColor', [0.2500 0.0600 0.2900, 0.3]);
また、おそらくMATLABにはスポイトに匹敵するような機能はないので、スポイトを使用したい場合は、外部ツールを使うことになると思います。(Windowsであれば、Microsoftが出しているPowerToysColorPickerがオススメです。)
  2 commentaires
交感神経優位なあかべぇ
plotのMarkerFaceColorは透明色の設定ができないみたいですね...。ただの丸でよければ、rectangleで代替できそうですが、ちゃんとした代替方法はちょっと分からないですね……。
gafakel
gafakel le 13 Sep 2023
ご回答ありがとうございます!
plotの4要素目に入力できるのは存じ上げていたのですが、rectangleもできるんですね。ただ、あくまで個人的になんですが、ドキュメントには載ってない(と認識している)ので、なんとなく4要素目を足すのをためらう部分があるんですよね……便利なのでいいとは思うんですが……。
MarkerFaceColorについてもご確認いただきありがとうございます!何だったら(面倒ではあるけど)Markerだけscatterで入れてもいいのかなとか思ったりしました。
ColorPicksもオススメいただいてありがとうございます。普通にMATLAB以外でも使いたいなと思ったのでインストールしてみます!

Connectez-vous pour commenter.


Atsushi Ueno
Atsushi Ueno le 5 Sep 2023
getframe関数で、Figureのフレームをイメージデータとして取り出す事が出来ました。
figure; hold on
plt=plot(0.5,2.5,"o","MarkerFaceColor",[0.2500 0.0600 0.2900],"Color",[0.2500 0.0600 0.2900],"MarkerSize",18);
pat=patch([1,1,3,3],[0,2,2,0],[0.2500 0.0600 0.2900],"FaceAlpha",0.3);
axis([0 3 0 3]);
F = getframe(gcf) % 指定された Figure をキャプチャ
F = struct with fields:
cdata: [433×577×3 uint8] colormap: []
mycolor = F.cdata(250,250,:); % Patchのピクセル値(描画されたRGB値)を取得
plot(0.5,1.0,"o","MarkerFaceColor",mycolor,"Color","k","MarkerSize",50); % 同色か確認
因みに、Figure⇒Axis⇒グラフィックオブジェクト⇒と目的とする情報まで辿っていく事も可能ですが、プロパティの数が非常に多くて辿り着くのが大変です。グラフィックス オブジェクトの階層 - MATLAB & Simulink - MathWorks 日本
  1 commentaire
gafakel
gafakel le 13 Sep 2023
ご回答ありがとうございます!
getframeはパラパラ漫画的に動画を撮る時に使うものだと思っていたので、ご教授いただいたようなイメージデータとしてのキャプチャに使えることを認識できておりませんでした……参考になります、ありがとうございます!察するにイメージデータのピクセル数が(250,250)のところのRGBデータ(3次元行列)を取っているものと理解しました。250のところを変えれば応用もききそうですね。

Connectez-vous pour commenter.

Catégories

En savoir plus sur グラフィックス パフォーマンス dans Help Center et File Exchange

Produits


Version

R2023a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!