我有一個網路應用程式,用戶可以在其中使用過濾器對比度來修改影像:filter: contrast(1.1)我想在 VIPS 中重現。(在紅寶石中)
雖然我還沒有找到任何關于如何在 Vips 中做到這一點的資訊。我看到 Vips 實作了 CLAHE 演算法https://github.com/libvips/libvips/issues/1576但這對我來說太過分了,并且可能不會回傳與 CSS 過濾器類似的對比度調整。
我還檢查了這個調整示例執行緒,但我找不到任何用于對比度調整的內容:https ://github.com/libvips/libvips/issues/59 ...
我也結束了 W3 解釋頁面,他們清楚地解釋了對比度調整所做的作業:https ://www.w3.org/TR/filter-effects/#contrastEquivalent
<filter id="contrast">
<feComponentTransfer>
<feFuncR type="linear" slope="[amount]" intercept="-(0.5 * [amount]) 0.5"/>
<feFuncG type="linear" slope="[amount]" intercept="-(0.5 * [amount]) 0.5"/>
<feFuncB type="linear" slope="[amount]" intercept="-(0.5 * [amount]) 0.5"/>
</feComponentTransfer>
</filter>
絕對棒極了。
現在我知道他們使用線性函式(我知道如何在 Vips 中利用它)并且它們保持在 RGB 顏色空間中。我知道斜率只是進行乘法運算。這很容易做到,因為我只需要傳遞一個陣列作為 Vips 線性函式的第一個引數。http://libvips.github.io/ruby-vips/Vips/Image.html#linear-instance_method
雖然我基本上不知道 Intercept 是什么以及 Vips Linear 函式是否提供類似的工具。
任何想法?
編輯編輯
好吧,好像 W3 一直在做一些有趣的事情。
將 CSS 過濾器contrast與 Vips 完全匹配的解決方案是:
divider = 256
contrast = 1.5
intercept = 0.5-(contrast*0.5)
im = Vips::Image.new_from_file "pic.jpg", access: :sequential
im = ((im * contrast / divider) intercept)*divider
im.write_to_file "output.jpg"
uj5u.com熱心網友回復:
是的,只需乘以改變對比度。從 CSS docs,linear只需計算:
C' = C * slope intercept
所以在 ruby??-vips 你可以寫:
#!/usr/bin/ruby
require 'vips'
contrast = 1.1
image = Vips::Image.new_from_file ARGV[0], access: :sequential
image = image.colourspace("scrgb")
image = image * contrast - (0.5 * contrast - 0.5)
image = image.colourspace("srgb")
image.write_to_file ARGV[1]
scRGB是 sRGB,但線性浮點數在 0 - 1 范圍內(黑色到白色)。
您可以使用linear而不是運算子多載,它會稍微快一些。
image = image.linear contrast, -0.5 * contrast - 0.5
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/503809.html
