Tôi bắt đầu viết mã chương trình xử lý hình ảnh từ các thuật toán xử lý hình ảnh khác nhau, chủ yếu từ công việc René Schulte, và khi điểm chuẩn, tôi nhận thấy rằng từ tất cả các hiệu ứng tôi có thể tìm thấy từ các nguồn khác nhau, mã để áp dụng hiệu ứng 'Softlight' là chậm nhất. Tôi không giỏi trong việc tối ưu hóa phương trình, nhưng tôi cảm thấy rằng bộ lọc dựa trên công thức có thể lặp lại các biến không có lý do.Công thức này lặp đi lặp lại hoặc tối ưu
Điều này có thể tóm tắt trong điều gì đó ngắn hơn hoặc nhanh hơn không?
// Basically, b is from Image A, and t from Image B
int csoftLight(float b, float t)
{
b /= 255;
t /= 255;
return (int)((t < 0.5) ? 255 * ((1 - 2 * t) * b * b + 2 * t * b) : 255 * ((1 - (2 * t - 1)) * b + (2 * t - 1) * (Math.Pow(b, 0.5))));
}
[Edit - Kết quả tìm kiếm bằng cách sử dụng phương trình Mohammed Hossain tìm thấy khoảng softlight trong PS]
// Input: 137 and 113
// Byte version:
int other = ((byte)((B < 128) ? (2 * ((A >> 1) + 64)) * ((float)B/255) : (255 - (2 * (255 - ((A >> 1) + 64)) * (float)(255 - B)/255))));
// Returns 116
// float version:
int res = (int)((t < 0.5) ? 255 * ((1 - 2 * t) * b * b + 2 * t * b) : 255 * ((1 - (2 * t - 1)) * b + (2 * t - 1) * (Math.Pow(b, 0.5))));
// Returns 129
[Chỉnh sửa]
Dưới đây là các thuật toán nhanh nhất dựa trên Mohammed Hossain câu trả lời:
int csoftLight(byte A, byte B)
{
return (int)((A < 128) ? (2 * ((B >> 1) + 64)) * ((float)A/255) : (255 - (2 * (255 - ((B >> 1) + 64)) * (float)(255 - A)/255)));
}
tôi hy vọng rằng các trình biên dịch sẽ làm loại bỏ subexpression thông thường, nhưng khi floating- điểm được tham gia ... – nneonneo
Và googling tên của guy mà thêm mã này vào nguồn gốc trả về không có gì.Tôi sẽ kết thúc gọi là coder! –
Số học hoạt động trên phao là tốn kém hơn sau đó trên số nguyên.Nếu nó có thể thay đổi kiểu tham số thành int, sau đó tôi có thể cung cấp giải pháp –