ビットマップアルファベベルアルゴリズム?


14

アルファをバンプマップとして使用して、ビットマップにベベル効果を追加するアルゴリズムを作成したいと考えています。

このようなことをどのようにすればいいですか?鏡面照明を試しましたが、ハイライトのみが得られ、シェードは得られません。

これが私が話している効果です(Photoshopを使用して作成): ここに画像の説明を入力してください

これらの全てを用いて行ったsize: 30px(ビットマップの輪郭からベベルの深さ)をangle 130altitude 50

左から右、上から下:

  1. チゼルハードベベル
  2. チゼルソフトベベル
  3. 滑らかなベベル
  4. チゼルハードでsoften: 16px-ぼやけた面取り?

これらのエフェクトをそれぞれ作成しようとしていますが、基本的なベベルを作成するにはどうすればよいですか?そして、その斜面からこれらのそれぞれに到達するには何が必要ですか

回答:


10

これは、距離変換の畳み込みで実現できます。

マスクのエッジで距離変換を使用します。次に、この距離変換のしきい値を設定して、ある距離を超える値を削除します。シェーディングを取得する秘secretは、距離変換の結果を次のようなカーネルで畳み込むことだと思います。

[ -1.0  -1.0  -1.0
  -1.0   0.0   0.0
  -1.0   0.0   1.0 ]

これにより、正しい方向に進むことができます。

#include "opencv/cv.h"
#include "opencv/highgui.h"

using namespace cv;
using namespace std;

int main() {
    Mat mask, dist, bevel;
    mask = Mat::zeros(200, 400, CV_8U);
    rectangle(mask, Point(30,30), Point(180,180), Scalar(255), -1);
    circle(mask, Point(30,30), 50, Scalar(0), -1);
    circle(mask, Point(180,180), 50, Scalar(0), -1);
    circle(mask, Point(300,100), 75, Scalar(255), -1);
    imshow("1",mask);

ここに画像の説明を入力してください

    //find edges and invert image for distance transform
    Canny(mask, dist, 50, 150);
    dist = 255-dist;
    distanceTransform(dist, dist, CV_DIST_L2, CV_DIST_MASK_5);
    threshold(dist, dist, 20, 20, CV_THRESH_TRUNC);
    blur(dist, dist, Size(3,3));
    dist.convertTo(bevel, CV_8U);
    equalizeHist(bevel, bevel);
    imshow("2",bevel);

ここに画像の説明を入力してください

    //convolve with secret sauce
    float d[] = {-1,-2,-3,
                 -2, 0, 0,
                 -3, 0, 1 };
    Mat kernel(3, 3, CV_32F, d);
    kernel = kernel - mean(kernel)[0];
    filter2D(dist, dist, CV_32F, kernel);

    //normalize filtering result to [-1, 1]
    double maxVal;
    minMaxLoc(dist, NULL, &maxVal);
    dist = 128 * dist / maxVal;

    //convert and display result
    dist.convertTo(bevel, CV_8U, 1, 128);
    bevel = bevel.mul(mask)/255;
    imshow("3", bevel);

ここに画像の説明を入力してください

    waitKey(0);
}

それらは素晴らしいですね!柔らかくしたものはぼかしのように見えますが、それらから「滑らかなベベル」を作成するにはどうすればよいですか?
シェドカン

Smooth Bevelは畳み込み前に距離マスクをぼかし、Softenは畳み込み後に結果をぼかします。
マットM.

4

Photoshopのベベルとエンボスは予想どおりに機能します。

1)一時的な8ビットシングルチャネルイメージで距離変換を計算する

  • Chiselは、面取りメトリック(サイズに応じて3x3、5x5、または7x7)のユークリッド距離変換を使用します。必要に応じて、正確なユークリッド距離変換を使用できます。アンチエイリアシングを行うことができるため、Meijsterの方が適しています(「線形時間で距離変換を計算する一般的なアルゴリズム」、MEIJSTER)。

  • Smooth Bevelは、面取り5-7-11距離変換とそれに続くボックスブラーの2つのアプリケーションを使用して、バンプマップを作成します。

2)中間距離変換画像にバンプマッピングを適用します。ブリンの独自のテクニックが適しています。

3)柔らかくするには、表面法線で畳み込みを実行するか、カーネルを使用してフィルター処理します。

4)バンプマップを使用して、サーフェス法線をグローバル光源と組み合わせて、-1〜1の値として照明強度を計算します。負の値は影、正の値はハイライト、絶対値は光の大きさです。ソース。

5)2つの8ビットシングルチャネル一時イメージが計算されます。1つはハイライト強度から、もう1つはシャドウからです。そこから、各マスクを使用して、色、ブレンドモード、および不透明度を使用してレイヤーに色を付けるのは簡単です。1つのマスクはハイライト用で、もう1つのマスクはシャドウ用です。

この一部を実装するためのVisual Basicソースコードは、次の場所にあります。

http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=51640&lngWId=1

詳細については、オープンソースのLayerEffectsプロジェクトをご覧ください。

https://github.com/vinniefalco/LayerEffects.git

これが誰かの助けになることを願っています。


ありがとう、私はあなたが言及したガウス距離変換に非常に興味があります、あなたは利用可能なコードを知っていますか?数式をうまく読むことができません。:(
シェドカン

既に投稿した情報以外、GDTについては何も見つけていません。
ヴィニーファルコ

「2)距離マッピング画像にバンプマッピングを適用する」とはどういう意味ですか?距離変換では距離(ピクセルごとに1つの数字)が得られますが、バンプマッピングには法線(ピクセルごとに2つの数字)が必要です...話の内容がわかりますか?
イヴァンクッキー

@IvanKuckir私はもっと明確になっているはずです-表面の法線は、距離変換を高さマップとして扱い、隣接する垂直および水平値からdx / dyを計算することで計算できます。これらの2つの数値は、バンプマッピングに必要な法線を提供します。
ヴィニーファルコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.