Workflow update
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
{"id":"147928be-ba9f-496d-8b40-629122a4ad37","revision":0,"last_node_id":8,"last_link_id":12,"nodes":[{"id":3,"type":"PreviewImage","pos":[60,130],"size":[340,440],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":12}],"outputs":[{"localized_name":"images","name":"images","type":"IMAGE","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.28.0","Node name for S&R":"PreviewImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":4,"type":"LoadImage","pos":[-1030,80],"size":[370,490],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[11]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.28.0","Node name for S&R":"LoadImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["ComfyUI_00014_ (3).png","image"]},{"id":8,"type":"RS_ImageAdjustments","pos":[-520,-30],"size":[500,741],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"IMAGE","link":11},{"localized_name":"brightness","name":"brightness","type":"INT","widget":{"name":"brightness"},"link":null},{"localized_name":"contrast","name":"contrast","type":"INT","widget":{"name":"contrast"},"link":null},{"localized_name":"hue","name":"hue","type":"INT","widget":{"name":"hue"},"link":null},{"localized_name":"saturation","name":"saturation","type":"INT","widget":{"name":"saturation"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[12]}],"properties":{"cnr_id":"ComfyUI_RaykoStudio","ver":"1c7a858cafe7f0e2e581e7527169ec105a6ff474","Node name for S&R":"RS_ImageAdjustments","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[0,0,0,0],"color":"#009933"}],"links":[[11,4,0,8,0,"IMAGE"],[12,8,0,3,0,"IMAGE"]],"groups":[],"config":{},"extra":{"ue_links":[],"links_added_by_ue":[],"ds":{"scale":1.2100000000000006,"offset":[1353.2705573948465,117.42593749801291]}},"version":0.4}
|
||||
{"id":"dc428e78-b0be-4d96-9c85-28eb45229ff0","revision":0,"last_node_id":4,"last_link_id":6,"nodes":[{"id":2,"type":"LoadImage","pos":[190,340],"size":[410,540],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[5]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.16.4","Node name for S&R":"LoadImage","enableTabs":false,"tabWidth":65,"tabXOffset":10,"hasSecondTab":false,"secondTabText":"Send Back","secondTabOffset":80,"secondTabWidth":65,"ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["._00001_.png","image"]},{"id":3,"type":"PreviewImage","pos":[1160,340],"size":[390,540],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":6}],"outputs":[{"localized_name":"images","name":"images","type":"IMAGE","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.16.4","Node name for S&R":"PreviewImage","enableTabs":false,"tabWidth":65,"tabXOffset":10,"hasSecondTab":false,"secondTabText":"Send Back","secondTabOffset":80,"secondTabWidth":65,"ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":4,"type":"RS_ImageAdjustments","pos":[630,340],"size":[500,771],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"IMAGE","link":5},{"localized_name":"brightness","name":"brightness","type":"INT","widget":{"name":"brightness"},"link":null},{"localized_name":"contrast","name":"contrast","type":"INT","widget":{"name":"contrast"},"link":null},{"localized_name":"sharpen","name":"sharpen","type":"INT","widget":{"name":"sharpen"},"link":null},{"localized_name":"hue","name":"hue","type":"INT","widget":{"name":"hue"},"link":null},{"localized_name":"saturation","name":"saturation","type":"INT","widget":{"name":"saturation"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[6]}],"properties":{"ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{}},"cnr_id":"ComfyUI_RaykoStudio","ver":"0c5f33499524b632abd4faf431599157136eb89e","Node name for S&R":"RS_ImageAdjustments"},"widgets_values":[-35,0,0,0,0]}],"links":[[5,2,0,4,0,"IMAGE"],[6,4,0,3,0,"IMAGE"]],"groups":[],"config":{},"extra":{"ue_links":[],"ds":{"scale":0.8264462809917354,"offset":[609.3357113646425,-36.26271335941804]},"links_added_by_ue":[]},"version":0.4}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
{"id":"dc428e78-b0be-4d96-9c85-28eb45229ff0","revision":0,"last_node_id":3,"last_link_id":3,"nodes":[{"id":3,"type":"PreviewImage","pos":[900,470],"size":[280,320],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":3}],"outputs":[],"properties":{"enableTabs":false,"tabWidth":65,"tabXOffset":10,"hasSecondTab":false,"secondTabText":"Send Back","secondTabOffset":80,"secondTabWidth":65,"cnr_id":"comfy-core","ver":"0.16.4","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{}},"Node name for S&R":"PreviewImage"}},{"id":2,"type":"LoadImage","pos":[310,470],"size":[280,326],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[2]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"enableTabs":false,"tabWidth":65,"tabXOffset":10,"hasSecondTab":false,"secondTabText":"Send Back","secondTabOffset":80,"secondTabWidth":65,"cnr_id":"comfy-core","ver":"0.16.4","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{}},"Node name for S&R":"LoadImage"},"widgets_values":["._00001_.png","image"]},{"id":1,"type":"RS_SaturationSwitch","pos":[610,470],"size":[270,58],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"IMAGE","link":2},{"localized_name":"intensity","name":"intensity","type":"FLOAT","widget":{"name":"intensity"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[3]}],"properties":{"enableTabs":false,"tabWidth":65,"tabXOffset":10,"hasSecondTab":false,"secondTabText":"Send Back","secondTabOffset":80,"secondTabWidth":65,"aux_id":"Raykosan/ComfyUI_RaykoStudio","ver":"ea64cd44b546b51bc9b4b41d267419f6134f4b14","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{}},"Node name for S&R":"RS_SaturationSwitch"},"widgets_values":[1]}],"links":[[2,2,0,1,0,"IMAGE"],[3,1,0,3,0,"IMAGE"]],"groups":[],"config":{},"extra":{"ue_links":[],"ds":{"scale":1.2100000000000006,"offset":[270.9430667365427,-124.82643236768305]}},"version":0.4}
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
{"id":"ec300d91-5775-45b4-952d-d1c8a58a5691","revision":0,"last_node_id":106,"last_link_id":183,"nodes":[{"id":100,"type":"RS_OverlayPro","pos":[2540,130],"size":[500,730],"flags":{"pinned":true},"order":4,"mode":4,"inputs":[{"localized_name":"image","name":"image","type":"IMAGE","link":169}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[182]}],"properties":{"cnr_id":"ComfyUI_RaykoStudio","ver":"2bbe4adeb4f9234034c70e3fc9ea0f4154e0eecc","Node name for S&R":"RS_OverlayPro","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":3,"type":"PreviewImage","pos":[3060,130],"size":[570,730],"flags":{"pinned":true},"order":5,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":182}],"outputs":[{"localized_name":"images","name":"images","type":"IMAGE","links":[183]}],"properties":{"cnr_id":"comfy-core","ver":"0.25.0","Node name for S&R":"PreviewImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":105,"type":"SaveImage","pos":[3650,130],"size":[590,730],"flags":{"pinned":true},"order":6,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":183},{"localized_name":"filename_prefix","name":"filename_prefix","type":"STRING","widget":{"name":"filename_prefix"},"link":null}],"outputs":[{"localized_name":"images","name":"images","type":"IMAGE","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.26.0","Node name for S&R":"SaveImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["ComfyUI"]},{"id":103,"type":"RS_OverlayPro","pos":[1500,130],"size":[500,730],"flags":{"pinned":true},"order":2,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"IMAGE","link":178}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[179]}],"properties":{"cnr_id":"ComfyUI_RaykoStudio","ver":"2bbe4adeb4f9234034c70e3fc9ea0f4154e0eecc","Node name for S&R":"RS_OverlayPro","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":99,"type":"RS_OverlayPro","pos":[2020,130],"size":[500,730],"flags":{"pinned":true},"order":3,"mode":4,"inputs":[{"localized_name":"image","name":"image","type":"IMAGE","link":179}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[169]}],"properties":{"cnr_id":"ComfyUI_RaykoStudio","ver":"2bbe4adeb4f9234034c70e3fc9ea0f4154e0eecc","Node name for S&R":"RS_OverlayPro","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":2,"type":"LoadImage","pos":[1070,130],"size":[410,570],"flags":{"pinned":true},"order":0,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[178]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.25.0","Node name for S&R":"LoadImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["ComfyUI_00005_ (2).png","image"]},{"id":106,"type":"Fast Groups Bypasser (rgthree)","pos":[1070,760],"size":[410,100],"flags":{"pinned":true},"order":1,"mode":0,"inputs":[],"outputs":[{"name":"OPT_CONNECTION","type":"*","links":null}],"properties":{"matchColors":"","matchTitle":"","showNav":true,"showAllGraphs":true,"sort":"position","customSortAlphabet":"","toggleRestriction":"default","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"color":"#322","bgcolor":"#533"}],"links":[[169,99,0,100,0,"IMAGE"],[178,2,0,103,0,"IMAGE"],[179,103,0,99,0,"IMAGE"],[182,100,0,3,0,"IMAGE"],[183,3,0,105,0,"IMAGE"]],"groups":[{"id":1,"title":"Overlay 2","bounding":[2010,60,520,810],"color":"#3f789e","flags":{"pinned":true}},{"id":2,"title":"Overlay 3","bounding":[2530,60,520,810],"color":"#3f789e","flags":{"pinned":true}}],"config":{},"extra":{"ue_links":[],"links_added_by_ue":[],"ds":{"scale":0.6934334949441373,"offset":[-463.92423240571884,203.39108182291372]}},"version":0.4}
|
||||
{"id":"ec300d91-5775-45b4-952d-d1c8a58a5691","revision":0,"last_node_id":107,"last_link_id":183,"nodes":[{"id":100,"type":"RS_OverlayPro","pos":[2540,130],"size":[500,730],"flags":{"pinned":true},"order":4,"mode":4,"inputs":[{"localized_name":"image","name":"image","type":"IMAGE","link":169}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[182]}],"properties":{"cnr_id":"ComfyUI_RaykoStudio","ver":"2bbe4adeb4f9234034c70e3fc9ea0f4154e0eecc","Node name for S&R":"RS_OverlayPro","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":3,"type":"PreviewImage","pos":[3060,130],"size":[570,730],"flags":{"pinned":true},"order":5,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":182}],"outputs":[{"localized_name":"images","name":"images","type":"IMAGE","links":[183]}],"properties":{"cnr_id":"comfy-core","ver":"0.25.0","Node name for S&R":"PreviewImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":105,"type":"SaveImage","pos":[3650,130],"size":[590,730],"flags":{"pinned":true},"order":6,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":183},{"localized_name":"filename_prefix","name":"filename_prefix","type":"STRING","widget":{"name":"filename_prefix"},"link":null}],"outputs":[{"localized_name":"images","name":"images","type":"IMAGE","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.26.0","Node name for S&R":"SaveImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["ComfyUI"]},{"id":103,"type":"RS_OverlayPro","pos":[1500,130],"size":[500,730],"flags":{"pinned":true},"order":2,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"IMAGE","link":178}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[179]}],"properties":{"cnr_id":"ComfyUI_RaykoStudio","ver":"2bbe4adeb4f9234034c70e3fc9ea0f4154e0eecc","Node name for S&R":"RS_OverlayPro","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":99,"type":"RS_OverlayPro","pos":[2020,130],"size":[500,730],"flags":{"pinned":true},"order":3,"mode":4,"inputs":[{"localized_name":"image","name":"image","type":"IMAGE","link":179}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[169]}],"properties":{"cnr_id":"ComfyUI_RaykoStudio","ver":"2bbe4adeb4f9234034c70e3fc9ea0f4154e0eecc","Node name for S&R":"RS_OverlayPro","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":[]},{"id":107,"type":"RS_Bypass","pos":[1050,740],"size":[410,120],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"bypass_state","name":"bypass_state","type":"STRING","widget":{"name":"bypass_state"},"link":null}],"outputs":[],"properties":{"ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{}},"cnr_id":"ComfyUI_RaykoStudio","ver":"0c5f33499524b632abd4faf431599157136eb89e","Node name for S&R":"RS_Bypass"},"widgets_values":["{\"nodes\":[],\"groups\":[1,2]}"]},{"id":2,"type":"LoadImage","pos":[1050,130],"size":[410,560],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[178]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.25.0","Node name for S&R":"LoadImage","ue_properties":{"widget_ue_connectable":{},"input_ue_unconnectable":{},"version":"7.8"}},"widgets_values":["ComfyUI_00005_ (2).png","image"]}],"links":[[169,99,0,100,0,"IMAGE"],[178,2,0,103,0,"IMAGE"],[179,103,0,99,0,"IMAGE"],[182,100,0,3,0,"IMAGE"],[183,3,0,105,0,"IMAGE"]],"groups":[{"id":1,"title":"Overlay 2","bounding":[2010,60,520,810],"color":"#3f789e","flags":{"pinned":true}},{"id":2,"title":"Overlay 3","bounding":[2530,60,520,810],"color":"#3f789e","flags":{"pinned":true}}],"config":{},"extra":{"ue_links":[],"links_added_by_ue":[],"ds":{"scale":0.6934334949441373,"offset":[-207.2305461361514,227.90677096101848]}},"version":0.4}
|
||||
-108
@@ -1,108 +0,0 @@
|
||||
## Анализ корректности расчетов параметров
|
||||
|
||||
После проверки кода выявлены следующие проблемы:
|
||||
|
||||
### 1. **Black & White** (функция `apply_black_and_white`)
|
||||
❌ **Ошибка**: параметры `yellow`, `cyan`, `magenta` не используются.
|
||||
Формула использует только коэффициенты для красного, зелёного и синего каналов:
|
||||
```python
|
||||
gray = r*(red/100) + g*(green/100) + b*(blue/100)
|
||||
```
|
||||
Это игнорирует цветовые тона жёлтого, циана и пурпурного, что не соответствует фотошопу.
|
||||
|
||||
**Правильный подход** (как в Photoshop):
|
||||
Для каждого пикселя определяется его доминирующий цветовой тон, и веса для преобразования в градации серого интерполируются между соседними цветами. Например, можно использовать HSV и взвешенную сумму яркостей по формуле:
|
||||
```
|
||||
gray = R * w_R + G * w_G + B * w_B
|
||||
```
|
||||
где веса зависят от оттенка:
|
||||
- для красных тонов → `w_R = red/100`, `w_G = 0`, `w_B = 0` (но с плавным переходом)
|
||||
- для жёлтых → комбинация `red` и `green`
|
||||
- для зелёных → `green`
|
||||
- для цианов → `green` и `blue`
|
||||
- для синих → `blue`
|
||||
- для пурпурных → `red` и `blue`
|
||||
|
||||
Реализация через интерполяцию по оттенку (hue):
|
||||
```python
|
||||
hue = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2HSV)[:,:,0] # 0..179
|
||||
# задаём веса для каждого цвета в градусах (0=красный, 30=жёлтый, 60=зелёный, 90=циан, 120=синий, 150=пурпурный)
|
||||
color_weights = {
|
||||
0: (red/100, 0, 0),
|
||||
30: (red/100, green/100, 0),
|
||||
60: (0, green/100, 0),
|
||||
90: (0, green/100, blue/100),
|
||||
120: (0, 0, blue/100),
|
||||
150: (red/100, 0, blue/100)
|
||||
}
|
||||
# для каждого пикселя интерполируем веса по hue
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. **Selective Color** (функция `apply_selective_color`)
|
||||
⚠️ **Неточность**: маска для выбранного цвета является **бинарной** (по жёстким порогам HSV), тогда как в фотошопе коррекция применяется плавно, пропорционально близости пикселя к целевому цвету.
|
||||
|
||||
**Улучшение**: использовать не бинарную маску, а весовой коэффициент от 0 до 1, вычисляемый на основе расстояния в цветовом пространстве (например, в HSV).
|
||||
Пример для красного:
|
||||
```python
|
||||
hue_dist = np.minimum(np.abs(h - 0), np.abs(h - 180)) # красный около 0 или 180
|
||||
mask = np.exp(-hue_dist**2 / sigma**2) * (s > 30) # гауссово взвешивание
|
||||
```
|
||||
Аналогично для других цветов.
|
||||
|
||||
Формула преобразования CMYK в RGB **верна**:
|
||||
- `K = 1 - max(R,G,B)`
|
||||
- `C = (1 - R - K) / (1 - K + eps)`
|
||||
- `M = (1 - G - K) / (1 - K + eps)`
|
||||
- `Y = (1 - B - K) / (1 - K + eps)`
|
||||
- После добавления поправок обратный переход:
|
||||
- `R = 1 - C - K`
|
||||
- `G = 1 - M - K`
|
||||
- `B = 1 - Y - K`
|
||||
|
||||
---
|
||||
|
||||
### 3. **Levels** (`apply_levels`)
|
||||
✅ **Формула верна**:
|
||||
```
|
||||
normalized = (img - in_min) / (in_max - in_min)
|
||||
result = clamp(normalized^(1/gamma), 0, 1) * 255
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. **Exposure** (`apply_exposure`)
|
||||
✅ **Формула верна** (экспозиция в стопах):
|
||||
```
|
||||
multiplier = 2^(exposure/100)
|
||||
result = img * multiplier + offset/100
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5. **Color Balance** (`apply_color_balance`)
|
||||
✅ **Маски и формулы коррекции** соответствуют распространённому подходу:
|
||||
- Яркость вычисляется по стандартной формуле `0.299*R + 0.587*G + 0.114*B`.
|
||||
- Маски теней, средних тонов и светов строятся через кусочно-линейные функции.
|
||||
- Коррекция добавляется к соответствующим каналам (R,G,B) с учётом знака (положительное → Red/Green/Blue, отрицательное → Cyan/Magenta/Yellow).
|
||||
|
||||
---
|
||||
|
||||
### 6. **Channel Mixer** (`apply_channel_mixer`)
|
||||
✅ **Формула полностью корректна**:
|
||||
```
|
||||
new_R = R * (red_red/100) + G * (red_green/100) + B * (red_blue/100)
|
||||
new_G = R * (green_red/100) + G * (green_green/100) + B * (green_blue/100)
|
||||
new_B = R * (blue_red/100) + G * (blue_green/100) + B * (blue_blue/100)
|
||||
```
|
||||
с последующим клиппированием в [0,1].
|
||||
|
||||
---
|
||||
|
||||
### Рекомендации по исправлению
|
||||
1. **Переписать `apply_black_and_white`** с учётом всех шести параметров (красный, жёлтый, зелёный, циан, синий, пурпурный) с использованием интерполяции по оттенку.
|
||||
2. **Заменить бинарные маски в `apply_selective_color`** на плавные веса (например, через гауссово расстояние по оттенку) для более точного соответствия фотошопу.
|
||||
3. Остальные функции оставить без изменений – они работают корректно.
|
||||
|
||||
При необходимости могу предоставить готовый исправленный код для `apply_black_and_white` и `apply_selective_color`.
|
||||
Reference in New Issue
Block a user