Here are the examples of individual H, S and B modifications.
This is the original image:
[1] H shift of 49º preserving S and B (I applied it only to the tulips, which were very easy to identify by just making sure only to shift their clearly identified tone range):
Uunatural tulips but the tone shift looks ok. In fact I repetead it in PS making use of the select by colour gamma tool, and tone/saturation tool to shift the Hue, and the result was almost identical.
The original (up) vs final (down) Hue histograms are here. The tulips merge into the same tone range as the crops, making them now indistinguisable in this histogram:
[2] S shift down to 1/3 of the original preserving H and BStrange view, but seems OK according to what we are doing and get the same appearance as with PS saturation tool.
[3] B applied an 's'-shape contrast curve preserving H and SThis one looks quite disgusting and unnatural, and seems to lack some detail (this was however expected as I am working in 8-bits in these tests that makes posterization easy to happen).
Hypothesis: maybe this is a perceptive reason for most programs to introduce some parallel adjust in Saturation (ACR, PS Norm, PS Lum) and in Hue (ACR, PS Norm) when performing contrast control.But I want to remark that mathematically this test is as correct as the other two ones.
For those interested in the code to achieve these tests:
lColour = MyObj1.GetColorAt(lX, lY)
iRGB(1) = GetR(lColour)
iRGB(2) = GetG(lColour)
iRGB(3) = GetB(lColour)
RGBtoHSV iRGB(1) / 255, iRGB(2) / 255, iRGB(3) / 255, H, S, V
Test 1 If H <> -1 And (H >= 240 Or H <= 15) Then
HSVtoRGB IIf(
H + iNTonos > 255,
H + iNTonos - 255, H + iNTonos), S, V, R, G, B
MyObj2.LineColor = RGB(Round(R * 255), Round(G * 255), Round(B * 255))
MyObj2.DrawPoint lX, lY
Else
MyObj2.LineColor = lColour
MyObj2.DrawPoint lX, lY
End If
Test 2 HSVtoRGB H,
S / 3, V, R, G, B
MyObj2.LineColor = RGB(Round(R * 255), Round(G * 255), Round(B * 255))
MyObj2.DrawPoint lX, lY
Test 3 HSVtoRGB H, S, IIf(
V <= 0.5, 2 * V * V, 0.5 * V ^ 0.5 / 0.5 ^ 0.5), R, G, B
MyObj2.LineColor = RGB(Round(R * 255), Round(G * 255), Round(B * 255))
MyObj2.DrawPoint lX, lY