बिटमैप अल्फा बेवल एल्गोरिथ्म?


14

मैं एक एल्गोरिथ्म बनाने के लिए देख रहा हूं जो बिटमैप के लिए एक बिटमैप प्रभाव का उपयोग करता है यह एक बम्प मैप के रूप में अल्फा है।

मैं इस तरह से कुछ करने कैसे जाऊंगा? मैंने स्पेक्युलर लाइटिंग की कोशिश की है लेकिन मुझे केवल हाइलाइट मिलता है न कि शेड।

यहाँ वह प्रभाव है जिसके बारे में मैं बात कर रहा हूँ (फोटोशॉप का उपयोग करके): यहाँ छवि विवरण दर्ज करें

इन सभी का उपयोग किया गया size: 30px(बिटमैप की समोच्च से बेवल की गहराई), angle 130, altitude 50

बाएं से दाएं, ऊपर से नीचे:

  1. छेनी हार्ड बेवेल
  2. छेनी मुलायम बेवल
  3. चिकनी बेवल
  4. छेनी हार्ड के साथ soften: 16px- एक धुंधला बीवेल?

मैं इनमें से प्रत्येक प्रभाव को बनाने की कोशिश कर रहा हूं, मैं मूल बेवेल बनाने के बारे में कैसे पता लगाऊंगा? और मुझे उस बेवेल से इनमें से प्रत्येक को प्राप्त करने की क्या आवश्यकता है

जवाबों:


10

यह दूरी परिवर्तन के एक दृढ़ संकल्प के साथ पूरा किया जा सकता है।

मास्क के किनारे पर एक दूरी परिवर्तन का उपयोग करें। फिर इस दूरी को कुछ दूरी से परे मानों को दूर करने के लिए रूपांतरित करें। मुझे लगता है कि छायांकन प्राप्त करने का राज एक कर्नेल के साथ दूरी परिवर्तन परिणाम को मनाने के लिए है जो कुछ इस तरह दिखता है:

[ -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);
}

वे भयानक लग रहे हो! नरम वाला एक धुंधला सा दिखता है, लेकिन मैं उनसे "चिकनी बेवल" कैसे बनाऊंगा?
शेडोकेन

मेरा मानना ​​है कि स्मूद बेवल दोषी होने से पहले डिस्टेंस मास्क को ब्लर कर देता है, और सॉफ्टन दोषी होने के बाद परिणाम को धुंधला कर देता है।
मैट एम।

4

फ़ोटोशॉप की बेवल और एम्बॉसफ़िल्में अनुमानित रूप से काम करती हैं:

1) एक अस्थायी 8-बिट एकल चैनल छवि में दूरी परिवर्तन की गणना करें

  • छेनी यूक्लिडियन डिस्ट ट्रांसफ़ॉर्म का उपयोग चम्फर मीट्रिक (3x3, 5x5, या 7x7 आकार के आधार पर) के साथ करती है। यदि आप चाहें तो एक सटीक यूक्लिडियन दूरी परिवर्तन का उपयोग कर सकते हैं, मैं मीजस्टर में से एक को पसंद करता हूं क्योंकि इसे एंटी-अलियास किया जा सकता है ("रैखिक समय में कम्प्यूटिंग दूरी रूपांतरण के लिए एक सामान्य एल्गोरिथम", MEIJSTER)।

  • स्मूद बेवल एक बम्फर मैप का उत्पादन करने के लिए एक बॉक्स ब्लर के दो अनुप्रयोगों के बाद एक चॉफर 5-7-11 दूरी परिवर्तन का उपयोग करता है।

2) अंतर दूरी परिवर्तन छवि के लिए टक्कर मानचित्रण लागू करें। ब्लाइन की मूल तकनीक उपयुक्त है।

3) नरम बनाने के लिए आप सतह के मानदंडों पर एक दृढ़ संकल्प प्रदर्शन कर सकते हैं या आप कर्नेल का उपयोग करके उन्हें फ़िल्टर कर सकते हैं।

4) बम्प मैप का उपयोग करते हुए सतह के मानदंड को वैश्विक प्रकाश स्रोत के साथ जोड़ दिया जाता है, ताकि प्रकाश की तीव्रता -1 से 1 के मान के रूप में गणना की जा सके, जहाँ नकारात्मक मान छाया हैं, सकारात्मक मान हाइलाइट हैं, और निरपेक्ष मान प्रकाश की भयावहता है। स्रोत।

5) दो 8-बिट एकल चैनल अस्थायी छवियों की गणना की जाती है, एक हाइलाइट तीव्रता से और दूसरी छाया से। वहां से प्रत्येक मुखौटे को एक रंग, ब्लेंड मोड और अपारदर्शिता का उपयोग करके परत को रंगने के लिए उपयोग करना मामूली बात है - हाइलाइट्स के लिए एक मुखौटा और छाया के लिए दूसरा।

इसमें से कुछ को लागू करने के लिए विजुअल बेसिक सोर्स कोड यहां पाया जा सकता है:

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

अधिक जानने के लिए कृपया मेरे ओपन सोर्स LayerEffects प्रोजेक्ट पर जाएँ:

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

मुझे उम्मीद है इससे किसी को सहायता मिलेगी।


धन्यवाद, मुझे आपके द्वारा उल्लिखित गौसियन डिस्टेंस ट्रांसफ़ॉर्म में बहुत दिलचस्पी है, क्या आप उपलब्ध किसी भी कोड के बारे में जानते हैं? मैं फॉर्मूला अच्छे से नहीं पढ़ पा रहा हूं। :(
Shedokan

मुझे GDT के बारे में कुछ भी नहीं मिला है, अन्य जानकारी के अलावा जो मैंने पहले ही पोस्ट की है।
विन्नी फाल्को

"2) से क्या मतलब है? दूरी परिवर्तन छवि के लिए टक्कर मानचित्रण लागू करें"? दूरी परिवर्तन दूरी देता है (प्रत्येक पिक्सेल के लिए 1 नंबर), जबकि बंप मैपिंग के लिए मानदंडों (प्रत्येक पिक्सेल के लिए 2 नंबर) की आवश्यकता होती है ... क्या आप सुनिश्चित हैं कि आप जानते हैं कि आप किस बारे में बात कर रहे हैं?
इवान कुकिर

@IvanKuckir मुझे और अधिक स्पष्ट होना चाहिए था - एक सतह सामान्य को एक ऊंचाई के नक्शे के रूप में दूरी के परिवर्तन का इलाज करके और पड़ोसी ऊर्ध्वाधर और क्षैतिज मूल्यों से dx / dy की गणना करके गणना की जा सकती है। ये दो नंबर बंप मैपिंग के लिए आवश्यक सामान्य प्रदान करते हैं।
विन्नी फाल्को
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.