Thuật toán góc xiên alpha?


14

Tôi đang tìm cách tạo ra một thuật toán có thêm hiệu ứng vát cho bitmap bằng cách sử dụng nó như một bản đồ.

Làm thế nào tôi sẽ đi làm một cái gì đó như thế này? Tôi đã thử ánh sáng đầu cơ nhưng tôi chỉ nhận được sự nổi bật và không có bóng râm.

Đây là hiệu ứng tôi đang nói đến (được thực hiện bằng Photoshop): nhập mô tả hình ảnh ở đây

Tất cả những điều này đã được thực hiện bằng cách sử dụng size: 30px(Độ sâu của góc xiên từ đường viền của bitmap) angle 130, altitude 50.

Từ trái sang phải, từ trên xuống dưới:

  1. Đục cứng vát
  2. Đục mềm vát
  3. Vát mịn
  4. Đục cứng với soften: 16px- một góc xiên?

Tôi đang cố gắng tạo từng hiệu ứng này, làm thế nào để tôi tạo ra góc xiên cơ bản? và tôi cần gì để có được những thứ này từ góc xiên đó

Câu trả lời:


10

Điều này có thể được thực hiện với một tổ hợp biến đổi khoảng cách.

Sử dụng một biến đổi khoảng cách trên các cạnh của mặt nạ. Sau đó ngưỡng biến đổi khoảng cách này để loại bỏ các giá trị vượt quá khoảng cách. Tôi nghĩ rằng bí mật để tạo bóng là kết hợp kết quả biến đổi khoảng cách với một hạt nhân trông giống như thế này:

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

Điều này sẽ giúp bạn bắt đầu đi đúng hướng:

#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);

nhập mô tả hình ảnh ở đây

    //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);

nhập mô tả hình ảnh ở đây

    //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);

nhập mô tả hình ảnh ở đây

    waitKey(0);
}

Chúng trông thật tuyệt! Cái có vẻ mềm mại trông như một vệt mờ, nhưng làm thế nào tôi có thể tạo ra "Vát mịn" từ chúng?
Shedokan

Tôi tin rằng Smooth Bevel làm mờ mặt nạ khoảng cách trước khi tích chập và Soften làm mờ kết quả sau khi tích chập.
Matt M.

4

Dự đoán Bevel and Chạm nổi của Photoshop:

1) Tính toán biến đổi khoảng cách trong hình ảnh kênh đơn 8 bit tạm thời

  • Chisel sử dụng Biến đổi khoảng cách Euclide với số liệu Chamfer (3x3, 5x5 hoặc 7x7 tùy thuộc vào kích thước). Bạn có thể sử dụng một biến đổi khoảng cách euclide chính xác nếu bạn muốn, tôi thích cái từ Meijster hơn vì nó có thể được khử răng cưa ("Thuật toán chung để tính toán biến đổi khoảng cách theo thời gian tuyến tính", MEIJSTER).

  • Smooth Bevel sử dụng biến đổi khoảng cách 5-7-11 của Chamfer, sau đó là hai ứng dụng làm mờ hộp, để tạo ra bản đồ vết sưng.

2) Áp dụng ánh xạ vết sưng cho hình ảnh biến đổi khoảng cách trung gian. Kỹ thuật ban đầu của Blinn là phù hợp.

3) Để làm mềm, bạn có thể thực hiện tích chập trên các quy tắc bề mặt hoặc bạn có thể lọc chúng bằng hạt nhân.

4) Sử dụng bản đồ va chạm, các quy tắc bề mặt được kết hợp với nguồn sáng toàn cầu để tính cường độ chiếu sáng theo giá trị từ -1 đến 1 trong đó các giá trị âm là bóng, giá trị dương là điểm nổi bật và giá trị tuyệt đối là độ lớn của ánh sáng nguồn.

5) Hai hình ảnh tạm thời kênh đơn 8 bit được tính toán, một từ cường độ nổi bật và một từ bóng tối. Từ đó, việc sử dụng mỗi mặt nạ để tô màu cho lớp bằng cách sử dụng màu sắc, chế độ hòa trộn và độ mờ - một mặt nạ cho các điểm nổi bật và mặt khác cho bóng tối là một vấn đề nhỏ.

Mã nguồn Visual Basic để thực hiện một số điều này có thể được tìm thấy ở đây:

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

Vui lòng truy cập dự án LayerEffects mã nguồn mở của tôi để tìm hiểu thêm:

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

Tôi hi vọng điêu nay se giup được ai đo.


Cảm ơn bạn, tôi rất quan tâm đến Biến đổi khoảng cách Gauss mà bạn đã đề cập, bạn có biết bất kỳ mã nào có sẵn không? Tôi không thể đọc công thức tốt. :(
Shedokan

Tôi không tìm thấy bất cứ điều gì về GDT, ngoài những thông tin tôi đã đăng.
Vinnie Falco

Bạn có ý nghĩa gì bởi "2) Áp dụng ánh xạ vết sưng cho hình ảnh biến đổi khoảng cách"? Biến đổi khoảng cách cho khoảng cách (1 số cho mỗi pixel), trong khi ánh xạ Bump yêu cầu quy tắc (2 số cho mỗi pixel) ... Bạn có chắc bạn biết bạn đang nói về điều gì không?
Ivan Kuckir

@IvanKuckir Tôi nên rõ ràng hơn - một bề mặt bình thường có thể được tính bằng cách coi biến đổi khoảng cách là bản đồ chiều cao và tính toán dx / dy từ các giá trị dọc và ngang lân cận. Hai số này cung cấp các yêu cầu bình thường cho ánh xạ vết sưng.
Vinnie Falco
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.