javascript - 交叉处理算法(图像处理)

标签 javascript image-processing image-manipulation cross-process

我正在用Javascript开发一个图像处理库,想知道实现“跨进程”效果的算法是什么

有点像这样

Sort of like this

最佳答案

我的脚本基于 http://photographypla.net/cross-processed-lightroom/

我使用根据分段曲线(对于红色和绿色 channel )和蓝色 channel 的双指数重新映射颜色来进行基本 channel 校正。我从 http://www.flong.com/texts/code/shapers_exp/ 获取的这些功能.

基本校正后的图像如下所示: enter image description here

您可以通过更改参数 sFactor1 和 sFactor2 来使用此结果。

之后我降低了总对比度并做了一些局部直方图增强,但我建议您不要使用这部分并寻找高光阴影和黑白调整的良好实现。

最终结果:

enter image description here

代码:

import cv2
import numpy as np
import math

# Define an S shape segmoid that with controlled shape. Based on http://www.flong.com/texts/code/shapers_exp/

# Function for sigmoid creation with s shape facor
def doubleExponentialSigmoid(x, a):

    epsilon = 0.00001
    min_param_a = 0.0 + epsilon
    max_param_a = 1.0 - epsilon
    a = min(max_param_a, max(min_param_a, a))
    a = 1.0 - a # for sensible results
    y = 0
    if x <= 0.5:
        y = (math.pow(2.0 * x, 1.0 / a)) / 2.0
    else:
        y = 1.0 - (pow(2.0 * (1.0-x), 1.0 / a)) / 2.0
    return y

# Function for reverse sigmoid creation with reverse s shape facor
def doubleExponentialSeat(x,a):

    epsilon = 0.00001
    min_param_a = 0.0 + epsilon
    max_param_a = 1.0 - epsilon
    a = min(max_param_a, max(min_param_a, a))
    y = 0
    if x <= 0.5:
        y = (math.pow(2.0*x, 1-a))/2.0;
    else:
        y = 1.0 - (math.pow(2.0*(1.0-x), 1-a))/2.0
    return y

# Function for s shape function creation
def getSigmoidLut(sFactor,reverseShape=False):
    rangeOfValues = np.arange(0, 1+(float(1) / float(255)), float(1) / float(255))
    index = 0
    sigmoidLUT = np.zeros_like(rangeOfValues)
    if reverseShape:
        for v in rangeOfValues:
            sigmoidLUT[index] = doubleExponentialSeat(v, sFactor)
            index = index + 1
    else:
        for v in rangeOfValues:
            sigmoidLUT[index] = doubleExponentialSigmoid(v, sFactor)
            index = index + 1

    return sigmoidLUT

# A function to map one range to another
def RangeMapping(currentMin,currentMax,newMin,newMax):

    newRange = np.zeros((256,1))
    for v in range(256):
        newRange[v] = (((v - currentMin) * (newMax - newMin)) / (currentMax - currentMin)) + newMin

    return newRange

# Function to lower contrast by a factor
def LowerContrast(intensityChannel, factor):

    # Second chane the contrast by the factor
    mappingLUT = RangeMapping(np.min(intensityChannel),np.max(intensityChannel),np.round(np.min(intensityChannel)*factor),np.round(np.max(intensityChannel)/factor))
    newIntensity = cv2.LUT(intensityChannel,mappingLUT)

    return newIntensity

# This cross processing is based on the tutorial in http://photographypla.net/cross-processed-lightroom/

# Params
sFactor1 = 0.7
sFactor2 = 0.3
lowContrastFactor = 1.05

# Read image
I = cv2.imread('im.jpg')

# Step 1: Separate to the three channels
R,G,B = cv2.split(I)

# Step 2: Map to a S curve each channel

# Get a S shaped segmoid
redChannelLUT = np.round(getSigmoidLut(sFactor1,False)*255).astype(np.uint8)
greenChannelLUT = redChannelLUT
blueChannelLUT =np.round(getSigmoidLut(sFactor2,True)*255).astype(np.uint8)

# Apply correction
redChannelCorrection = cv2.LUT(R, redChannelLUT)
greenChannelCorrection = cv2.LUT(G, greenChannelLUT)
blueChannelCorrection = cv2.LUT(B, blueChannelLUT)

# Step 3: Merge corrected channels
ICorrection = cv2.merge((redChannelCorrection,greenChannelCorrection,blueChannelCorrection))

# From here you can do whatever you want to the colors shadows highlights etc...
# Separate color and intensity
Iycr = cv2.cvtColor(ICorrection,cv2.COLOR_RGB2YCR_CB)
intensityCh,C,R = cv2.split(Iycr)

# Step 4: lower contrast
newLowerIntensityContrast = LowerContrast(intensityCh,lowContrastFactor)

# Step 5: Local contrast enhacment
clahe = cv2.createCLAHE(clipLimit=1.0, tileGridSize=(8,8))
ICorrectedShadows = clahe.apply(newLowerIntensityContrast.astype(np.uint8))

# Final step re construct image
IycrLowContrast = cv2.merge((ICorrectedShadows,C,R))
finalImage = cv2.cvtColor(IycrLowContrast,cv2.COLOR_YCrCb2RGB)

cv2.imshow('Original',I)
cv2.imshow('ColorCorrection',ICorrection)
cv2.imshow('LowContrast',newLowerIntensityContrast.astype(np.uint8))
cv2.imshow('Final',finalImage)

关于javascript - 交叉处理算法(图像处理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38992783/

相关文章:

javascript - 如何访问window对象的location属性?

arrays - 为什么 Array.length 不适用于键字符串

javascript - 解决函数未注入(inject)到 Controller 中的问题 [Angular JS]

image - 仅比较纯图像数据和图像相似度的重复照片搜索?

c++ - 将 YCrCb 图像拆分为其强度 channel

image-processing - RAW 图像文件 - 我的数据是什么格式?

java - 使用 ImageJ 库 (Java) 增加图像对比度

css - 使用 CSS 着色图像而不覆盖

javascript - 确定 html 表中的第一行

python - 基于边缘像素图的图像分割