อัลกอริทึมเอียงบิตแมปอัลฟา


14

ฉันกำลังมองหาที่จะสร้างอัลกอริทึมที่เพิ่มเอฟเฟกต์มุมเอียงไปยังบิตแมปโดยใช้อัลฟ่าเป็นแผนที่ชน

ฉันจะไปทำอะไรแบบนี้ได้อย่างไร ฉันลองแสงแบบพิเศษ แต่ฉันได้เฉพาะไฮไลต์ไม่ใช่ที่ร่ม

นี่คือผลกระทบที่ฉันกำลังพูดถึง (ทำโดยใช้ Photoshop): ป้อนคำอธิบายรูปภาพที่นี่

ทั้งหมดเหล่านี้ได้กระทำโดยใช้(ความลึกของมุมจากรูปร่างของบิตแมป)size: 30px ,angle 130altitude 50

จากซ้ายไปขวาบนลงล่าง:

  1. สิ่วยกนูน
  2. Chisel Soft Bevel
  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);
}

ดูดีมาก! คนที่ดูนุ่มนวลดูเหมือนเบลอ แต่ฉันจะสร้าง "Smooth Bevel" จากพวกเขาได้อย่างไร
Shedokan

ฉันเชื่อว่า Smooth Bevel ทำให้หน้ากากระยะทางเบลอก่อนที่จะเกิดการบิด
แมตต์เอ็ม

4

Bevel and Emboss ของ Photoshop สามารถทำงานได้อย่างคาดการณ์:

1) คำนวณการแปลงระยะทางในรูปภาพช่อง 8 บิตชั่วคราว

  • สิ่วใช้การแปลงระยะทางแบบยุคลิดด้วยการลบมุมลบมุม (3x3, 5x5 หรือ 7x7 ขึ้นอยู่กับขนาด) คุณสามารถใช้การแปลงระยะทางแบบยุคลิดแน่นอนถ้าคุณต้องการฉันชอบแบบจาก Meijster เพราะมันสามารถทำการต่อต้านนามแฝง ("อัลกอริทึมทั่วไปสำหรับการแปลงระยะทางคอมพิวเตอร์ในเชิงเส้นเวลา", MEIJSTER)

  • Smooth Bevel ใช้การแปลงระยะ Chamfer 5-7-11 ตามด้วยสองแอพพลิเคชั่นของกล่องเบลอเพื่อสร้างแผนที่การชน

2) ใช้การทำแผนที่ bump กับรูปภาพการแปลงระยะทางระดับกลาง เทคนิคดั้งเดิมของ Blinn นั้นเหมาะสม

3) สำหรับการทำให้อ่อนลงคุณสามารถทำการแปลงบนพื้นผิวปกติหรือคุณสามารถกรองโดยใช้เคอร์เนล

4) การใช้แผนที่ชนพื้นผิวปกติจะถูกรวมเข้ากับแหล่งกำเนิดแสงทั่วโลกเพื่อคำนวณความเข้มของแสงเป็นค่าจาก -1 ถึง 1 โดยที่ค่าลบเป็นเงาค่าบวกเป็นไฮไลท์และค่าสัมบูรณ์คือขนาดของแสง แหล่ง

5) คำนวณภาพชั่วคราว 8 บิตสองช่องหนึ่งภาพจากความเข้มแสงไฮไลท์และอีกภาพหนึ่งจากเงา จากตรงนั้นเป็นเรื่องเล็กน้อยที่จะใช้มาสก์แต่ละตัวเพื่อแต้มเลเยอร์โดยใช้สีโหมดการผสมผสานและความทึบ - หนึ่งมาสก์สำหรับไฮไลท์และอีกอันสำหรับเงา

ซอร์สโค้ด Visual Basic สำหรับการนำไปใช้บางส่วนสามารถพบได้ที่นี่:

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

กรุณาเยี่ยมชมโครงการ OpenEffects ของฉันเพื่อเรียนรู้เพิ่มเติม:

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

ฉันหวังว่านี่จะช่วยให้ใครบางคน


ขอบคุณฉันสนใจการแปลงแบบเกาส์ระยะทางมากที่คุณกล่าวถึงคุณทราบรหัสใดบ้าง ฉันไม่สามารถอ่านสูตรได้ดี :(
Shedokan

ฉันไม่พบอะไรเกี่ยวกับ GDT นอกเหนือจากข้อมูลที่ฉันโพสต์ไปแล้ว
Vinnie Falco

คุณหมายถึงอะไรโดย "2) ใช้การแมป bump กับรูปภาพการแปลงระยะทาง" การแปลงระยะทางให้ระยะทาง (1 หมายเลขสำหรับแต่ละพิกเซล) ในขณะที่การทำแผนที่ Bump ต้องการบรรทัดฐาน (2 หมายเลขสำหรับแต่ละพิกเซล) ... คุณแน่ใจหรือไม่ว่าคุณกำลังพูดถึงอะไร
Ivan Kuckir

@IvanKuckir ฉันควรมีความชัดเจนมากขึ้น - พื้นผิวปกติสามารถคำนวณได้โดยทำการแปลงระยะทางเป็นแผนที่ความสูงและคำนวณ dx / dy จากค่าแนวตั้งและแนวนอนข้างเคียง ตัวเลขสองตัวเหล่านี้ให้ตามปกติที่จำเป็นสำหรับการแมป bump
Vinnie Falco
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.