S型曲线的几种设计(图像对比度调节)

一般来讲,图像调色模块都会提供“曲线”工具,这是一个极其灵活的功能,绝大部分的调色都可以通过该工具实现,但是曲线功能的交互相对而言比较复杂。出于简便性和效率方面的考量,调色模块往往还会提供一些具有很强的功能倾向性,但是交互很简单,一个滑竿就可以搞定的功能,如“对比度,色温,色调,高光,阴影,黑点,白点,等等等等”。

本文要讲的S型曲线就常用于增强对比度,对于灰蒙蒙的图片,提高对比度能够起到一定去灰,增加通透感的作用。

一般来说,用于增强对比度的S型曲线要具备以下一些性质:

  • 曲线要位于[0, 1]之间。
  • (0, 0)(1, 1)两个点。
  • 有一个旋转支点,位于y=x上,记为(pivot, pivot)

下面提供一些符合以上性质的S型曲线设计思路。

一、指数型S曲线

1. 必过(0.5, 0.5)的指数曲线

公式:
y = x p x p + ( 1 − x ) p y = \frac{x^p}{x^p+(1-x)^p} y=xp+(1x)pxp
其导数:
y ′ = p x p ( 1 − x ) p x ( 1 − x ) [ x p + ( 1 − x ) p ] 2 y' = \frac{px^p(1-x)^p}{x(1-x)[x^p+(1-x)^p]^2} y=x(1x)[xp+(1x)p]2pxp(1x)p

该曲线的性质:

  • 当p>1时是正S型曲线;当0<p<1时是反S型曲线;当p=1时变为y=x。
  • 旋转支点必为(0.5, 0.5),也就是说该公式没有提供参数可以让我们任意指定旋转支点。
  • 支点处的斜率等于p,将x=0.5代入导数公式即可得。
  • 当p>1时,x=0和x=1处的导数为0,同样带入导数公式可得。

请添加图片描述

2. 可过任意支点的指数曲线

公式(分段函数):
y = p i v o t ( x p i v o t ) p , 0 < x < = p i v o t y = 1 − ( 1 − p i v o t ) ( 1 − x 1 − p i v o t ) p , p i v o t < x < = 1 \begin{aligned} y &= pivot(\frac{x}{pivot})^p, {0<x<=pivot} \\[2ex] y &= 1-(1-pivot)(\frac{1-x}{1-pivot})^p, {pivot<x<=1} \end{aligned} yy=pivot(pivotx)p,0<x<=pivot=1(1pivot)(1pivot1x)p,pivot<x<=1

其导数:
y ′ = p ( x p i v o t ) p − 1 , 0 < x < = p i v o t y ′ = p ( 1 − x 1 − p i v o t ) p − 1 , p i v o t < x < = 1 \begin{aligned} y' &= p(\frac{x}{pivot})^{p-1}, {0<x<=pivot} \\[2ex] y' &= p(\frac{1-x}{1-pivot})^{p-1}, {pivot<x<=1} \end{aligned} yy=p(pivotx)p1,0<x<=pivot=p(1pivot1x)p1,pivot<x<=1

该曲线的性质:

  • 当p>1时是正S型曲线;当0<p<1时是反S型曲线;当p=1时变为y=x。
  • 旋转支点为(pivot, pivot)
  • 支点处的斜率等于p,且支点处的函数值和斜率都是连续的,将x=pivot代入上述公式和导数公式即可得。
  • 当p>1时,x=0和x=1处的导数为0。

请添加图片描述

使用该曲线调整一张图片示例如下(pivot=0.435,p=2),上图是原图,下图是调节后的效果。
容易看出,增加对比度可有效提高图片通透感,减弱灰蒙蒙的感觉。
请添加图片描述

指数型S曲线代码:

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt


def power_symmetric(x, p):
    xp = np.power(x, p)
    xip = np.power(1. - x, p)
    return xp / (xp + xip)


def power_low(x, p, pivot):
    return pivot * np.power(x / pivot, p)


def power_high(x, p, pivot):
    pivot = 1. - pivot
    return 1. - pivot * np.power((1. - x) / pivot, p)


def main():
    pivot = 0.4
    x = np.linspace(0, 1, 1000)
    index_low = x <= pivot
    index_high = ~index_low

    # symmetric power style s curve
    plt.figure(figsize=(6, 6))
    for p in [0.2, 0.5, 1, 2, 5]:
        y = power_symmetric(x, p)
        plt.plot(x, y, label='power = %0.1f' % p)
    plt.grid()
    plt.legend(loc='best')
    plt.title('symmetric power style s-curve')
    plt.savefig('symmetric_power_style_s_curve.png', dpi=300)

    # power style s curve
    y = x.copy()
    plt.figure(figsize=(6, 6))
    for p in [0.2, 0.5, 1, 2, 5]:
        y[index_low] = power_low(x[index_low], p, pivot)
        y[index_high] = power_high(x[index_high], p, pivot)
        plt.plot(x, y, label='power = %0.1f' % p)
    plt.grid()
    plt.legend(loc='best')
    plt.title('power style s-curve, pivot=%0.1f' % pivot)
    plt.savefig('power_style_s_curve_pivot=%0.1f.png' % pivot, dpi=300)


def main_enhance_contrast():
    pivot = 0.435
    p = 2
    image = cv2.imread('gray.jpg')
    image_adjust = image / 255.
    index = image_adjust <= pivot
    image_adjust[index] = power_low(image_adjust[index], p, pivot)
    index = ~index
    image_adjust[index] = power_high(image_adjust[index], p, pivot)
    image_adjust = np.uint8(np.clip(np.round(image_adjust * 255.), 0, 255))

    image_concat = np.concatenate([image, image_adjust], axis=0)
    cv2.imwrite('enhance_contrast.png', image_concat)


if __name__ == '__main__':
    main()
    main_enhance_contrast()


二、基于分段线性函数的S曲线

1. 分段线性函数
公式(分段线性函数):
y = x k , 0 < x < = p i v o t ∗ k k + 1 y = k ( x − p ) + p , p i v o t ∗ k k + 1 < x < = p i v o t ∗ k + 1 k + 1 y = x − 1 k + 1 , p i v o t ∗ k + 1 k + 1 < x < = 1 \begin{aligned} y &= \frac{x}{k}, {0<x<=\frac{pivot*k}{k+1}} \\[2ex] y & = k(x-p)+p, {\frac{pivot*k}{k+1} < x <=\frac{pivot*k+1}{k+1}} \\[2ex] y &= \frac{x-1}{k}+1, {\frac{pivot*k+1}{k+1}<x<=1} \end{aligned} yyy=kx,0<x<=k+1pivotk=k(xp)+p,k+1pivotk<x<=k+1pivotk+1=kx1+1,k+1pivotk+1<x<=1

三条直线的设计原则比较简单,利用点斜式直线公式求解即可:

  • 暗部直线(low-line):过(0, 0),斜率为 1/k
  • 中灰部直线(middle-line):过(pivot, pivot),斜率为k
  • 亮部直线(high-line):过(1, 1),斜率为 1/k

然后根据暗部和中灰部联立,以及中灰部与亮部联立,分别可以求出两个分界点的坐标,也已经在上面公式中了。
请添加图片描述

这个分段线性函数其实也可以用来做对比度调节,只是我们很多时候会希望曲线的变化能圆润一些,不要那么有棱角。

2. 给分段线性函数加上圆润的过渡

方法:在直线交叉的地方使用一个圆弧进行过渡,圆弧与两直线分别相切,相切就代表函数值和一阶导均连续。根据这个条件就可进行相应的圆的方程计算。但需注意实际上我们计算的是一个半圆,所以需要仔细判别半圆方程根号前的正负号。

下面以low-middle的过渡为例进行说明。
此时有三个关键点,依次是:(0,0),low-middle两直线交点,(pivot, pivot)。
以交点为中心,向两侧端点分别延展一定长度,比例记为perc,可以得到分别位于low-line上的x1,和位于middle-line上的x2,进而可得与x1对应的函数值y1,斜率k1,以及与x2对应的y2,k2。这就是我们计算圆弧所需的参数集合:(x1, y1, k1, x2, y2, k2)

因为low-line和middle-line分别是圆的切线,所以可以过切点分别做两线的垂线,交点就是圆心,进而可以根据圆心与切点之间的距离求出半径,此时圆方程的所有参数就求出来了。

过圆心的两直线方程:
y = − x − x 1 k 1 + y 1 y = − x − x 2 k 2 + y 2 \begin{aligned} y &= -\frac{x-x_1}{k_1}+y_1 \\[2ex] y &= -\frac{x-x_2}{k_2}+y_2 \end{aligned} yy=k1xx1+y1=k2xx2+y2
圆心求解后记为(a, b),半径记为r,求解得:
a = k 2 x 1 − k 1 x 2 + k 1 k 2 ( y 1 − y 2 ) k 2 − k 1 b = − a − x 1 k 1 + y 1 r = ( a − x 1 ) 2 + ( b − y 1 ) 2 \begin{aligned} a &= \frac{k_2x_1-k_1x_2+k_1k_2(y_1-y_2)}{k_2-k_1} \\[2ex] b &= -\frac{a-x_1}{k_1}+y_1 \\[2ex] r &= \sqrt{(a-x_1)^2+(b-y_1)^2} \end{aligned} abr=k2k1k2x1k1x2+k1k2(y1y2)=k1ax1+y1=(ax1)2+(by1)2

半圆的方程为:
y = ± r 2 − ( x − a ) 2 + b y = \pm \sqrt{r^2 - (x-a)^2}+b y=±r2(xa)2 +b

注:该方法实际可以作为任意两段曲线平滑过渡的通用方案。

该曲线的一些性质:

  • 当k>1时是正S型曲线;当0<k<1时是反S型曲线;当k=1时应当直接使用y=x(注意这里不是退化成y=x,所以需要写if else语句去直接使用y=x,因为当k=1时,圆的方程是无解的)。
  • 旋转支点为(pivot, pivot)
  • 如果以y=x为轴将曲线放平(也就是顺时针旋转45度),那么两节点之间的曲线凸包是左右对称的。
  • 在x=0和x=1处,曲线的导数是1/k,因为两端点处仍是直线方程形态。
    请添加图片描述

基于分段线性函数的S型曲线代码:

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt


def get_low_line(x, k):
    return 1 / k * x


def get_high_line(x, k):
    return 1 / k * (x - 1.) + 1.


def get_middle_line(x, k, pivot):
    return k * (x - pivot) + pivot


def linear_interpolate(x_beg, x_end, perc):
    return perc * (x_end - x_beg) + x_beg


def get_arc_params(x1, y1, k1, x2, y2, k2):
    a = (k2 * x1 - k1 * x2 + k1 * k2 * (y1 - y2)) / (k2 - k1)
    b = -(a - x1) / k1 + y1
    r_square = (a - x1) * (a - x1) + (b - y1) * (b - y1)
    return a, b, r_square


def get_low_arc_params(k, pivot, perc):
    x_border = pivot * k / (k + 1)  # left border
    x1 = linear_interpolate(x_border, 0, perc)  # located at low line
    y1 = get_low_line(x1, k)
    k1 = 1 / k
    x2 = linear_interpolate(x_border, pivot, perc)  # located at middle line
    y2 = get_middle_line(x2, k, pivot)
    k2 = k
    a, b, r_square = get_arc_params(x1, y1, k1, x2, y2, k2)
    return a, b, r_square, x1, x2


def get_high_arc_params(k, pivot, perc):
    x_border = (pivot * k + 1) / (k + 1)  # right border
    x1 = linear_interpolate(x_border, pivot, perc)  # located at middle line
    y1 = get_middle_line(x1, k, pivot)
    k1 = k
    x2 = linear_interpolate(x_border, 1., perc)  # located at high line
    y2 = get_high_line(x2, k)
    k2 = 1 / k
    a, b, r_square = get_arc_params(x1, y1, k1, x2, y2, k2)
    return a, b, r_square, x1, x2


def get_arc(x, a, b, r_square, sign):
    return sign * np.sqrt(r_square - (x - a) * (x - a)) + b


def main_line():
    pivot = 0.4
    x = np.linspace(0, 1, 1000)

    y = x.copy()
    plt.figure(figsize=(6, 6))
    for k in [0.2, 0.5, 1, 2, 5]:
        x_border_left = pivot * k / (k + 1)
        x_border_right = (pivot * k + 1) / (k + 1)
        index_low = x <= x_border_left
        index_mid = (x > x_border_left) & (x < x_border_right)
        index_high = x >= x_border_right
        y[index_low] = get_low_line(x, k)[index_low]
        y[index_mid] = get_middle_line(x, k, pivot)[index_mid]
        y[index_high] = get_high_line(x, k)[index_high]
        plt.plot(x, y, label='k = %0.1f' % k)
    plt.grid()
    plt.legend(loc='best')
    plt.title('piecewise lines, pivot=%0.1f' % pivot)
    plt.savefig('piecewise_lines_pivot=%0.1f.png' % pivot, dpi=300)


def main_all():
    pivot = 0.4
    perc = 0.5
    x = np.linspace(0, 1, 1000)

    y = x.copy()
    plt.figure(figsize=(6, 6))
    for k in [0.2, 0.5, 1, 2, 5]:
        if np.abs(k - 1) < 1e-5:
            y = x.copy()
        else:
            a_low, b_low, r_square_low, x_low, x_mid_left = \
                get_low_arc_params(k, pivot, perc)
            a_high, b_high, r_square_high, x_mid_right, x_high = \
                get_high_arc_params(k, pivot, perc)
            # low line
            index = (x >= 0) & (x <= x_low)
            y[index] = get_low_line(x, k)[index]
            # low-middle arc
            index = (x > x_low) & (x <= x_mid_left)
            sign = np.sign(1 - k)
            y[index] = get_arc(x, a_low, b_low, r_square_low, sign)[index]
            # middle line
            index = (x > x_mid_left) & (x <= x_mid_right)
            y[index] = get_middle_line(x, k, pivot)[index]
            # middle-high arc
            index = (x > x_mid_right) & (x <= x_high)
            sign = np.sign(k - 1)
            y[index] = get_arc(x, a_high, b_high, r_square_high, sign)[index]
            # high line
            index = (x > x_high) & (x <= 1)
            y[index] = get_high_line(x, k)[index]
        plt.plot(x, y, label='k = %0.1f' % k)
    plt.grid()
    plt.legend(loc='best')
    plt.title('line based piecewise s-curve, pivot=%0.1f, perc=%0.1f' % (
        pivot, perc))
    plt.savefig('line_based_piecewise_s_curve_pivot=%0.1f_perc=%0.1f.png' % (
        pivot, perc), dpi=300)


if __name__ == '__main__':
    main_line()
    main_all()

三、基于sigmoid类型函数的S曲线

这里以sigmoid为例,具备此类函数性质的其他函数也可以采用类似方案设计,如tanh。

sigmoid函数如下:
y = 1 1 + e − x y = \frac{1}{1+e^{-x}} y=1+ex1
在这里插入图片描述
sigmoid函数不能直接用来做对比度调节,因为它的函数值在左右两侧分别渐进于0和1,而不能直接等于,另外它很难退化为直线形态。

(PS:尽管有时候我们也需要把黑白点拉离(0, 0)和(1, 1),但那是综合调节的结果,或是曲线这种灵活性很高的功能调节的结果,作为单一小项的对比度来说,不建议耦合此类操作)

如果想要利用好这种天然呈现S形状的函数,就要做一些改造以及方案适配。
首先改造基础形态,增加旋转支点相关的参数:
y = 1 1 + e − k ( x − p i v o t ) + p i v o t − 0.5 y=\frac{1}{1+e^{-k(x-pivot)}}+pivot-0.5 y=1+ek(xpivot)1+pivot0.5
其导数为:
y ′ = k e − k ( x − p i v o t ) ( 1 + e − k ( x − p i v o t ) ) 2 y' = \frac{ke^{-k(x-pivot)}}{(1+e^{-k(x-pivot)})^2} y=(1+ek(xpivot))2kek(xpivot)

导数还有个简便的计算方法是:
y = y − ( p i v o t − 0.5 ) y ′ = k y ( 1 − y ) y = y-(pivot-0.5) \\[2ex] y' = ky(1-y) y=y(pivot0.5)y=ky(1y)
pivot用于调节旋转支点就不用多解释了,k用于调节S形态的强弱。当pivot=0.4,k=8时示例如下:
在这里插入图片描述

接下来我们给曲线增加一个随x变化的校正,让其满足开头所说的S型曲线的几个标准,如下图:请添加图片描述

大致的原理是:采用归一化的一阶导差异作为修正因子,对函数值进行修正。
(PS:下面是一种可用的方案,但不一定很好,肯定还有更好的)

具体步骤是(仅描述左半支,右半支同理):

  • 将导数公式画出来易知,pivot处导数最大,记为slope_max。
  • 计算0处的一阶导,记为slope0。
  • 计算左半支最大一阶导差异slope0_diff = slope_max - slope0。
  • 计算左半支最大函数值差异y0_diff = 0.0 - y0。
  • 那么左半支任意点的修正量是:
    a d j u s t m e n t = ( s l o p e _ m a x − s l o p e s l o p e 0 _ d i f f ) 2 ∗ y 0 _ d i f f adjustment = (\frac{slope\_max - slope}{slope0\_diff })^2 *y0\_diff adjustment=(slope0_diffslope_maxslope)2y0_diff

在上图蓝线的基础上,作如下修正即可得到黄线
y = y + a d j u s t m e n t y = y+adjustment y=y+adjustment

整体效果如下:
请添加图片描述

该曲线的一些性质:

  • 该曲线无法退化成严格的y=x。
  • k与S形态强弱的对应关系不是很有规律,需要单独设计一个k的变化函数。
  • 旋转支点为(pivot, pivot)
  • 当pivot离开0.5较远,且k较大时,上述校正方案会出现穿越[0, 1]区间的情况,这是个问题。

基于sigmoid类型函数的S曲线代码如下:

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt


def get_sigmoid(x, k, pivot):
    return 1.0 / (1.0 + np.exp(-k * (x - pivot))) + pivot - 0.5


def get_sigmoid_derivative(x, k, pivot):
    y = get_sigmoid(x, k, pivot) - (pivot - 0.5)
    return k * y * (1.0 - y)


def get_sigmoid_s_curve(x, k, pivot):
    y = get_sigmoid(x, k, pivot)
    y0 = get_sigmoid(0.0, k, pivot)
    y1 = get_sigmoid(1.0, k, pivot)
    slope = get_sigmoid_derivative(x, k, pivot)
    slope0 = get_sigmoid_derivative(0.0, k, pivot)
    slope1 = get_sigmoid_derivative(1.0, k, pivot)
    slope_max = get_sigmoid_derivative(pivot, k, pivot)

    y0_diff = 0.0 - y0
    y1_diff = 1.0 - y1
    slope0_diff = slope_max - slope0
    slope1_diff = slope_max - slope1

    # process low range
    index = x <= pivot
    scale = (slope_max - slope) / slope0_diff
    scale = scale ** 2
    y[index] = (y + scale * y0_diff)[index]

    # process high range
    index = ~index
    scale = (slope_max - slope) / slope1_diff
    scale = scale ** 2
    y[index] = (y + scale * y1_diff)[index]
    return y


def main():
    pivot = 0.4
    x = np.linspace(0, 1, 1000)

    plt.figure(figsize=(6, 6))
    for k in [0.1, 2, 4.1, 8, 16]:
        y = get_sigmoid_s_curve(x, k, pivot)
        plt.plot(x, y, label='k = %0.1f' % k)
    plt.grid()
    plt.legend(loc='best')
    plt.title('sigmoid style s-curve, pivot=%0.1f' % pivot)
    plt.savefig('sigmoid_style_s_curve_pivot=%0.1f.png' % pivot, dpi=300)


def main_compare_adjustment():
    pivot = 0.4
    k = 8
    x = np.linspace(0, 1, 1000)

    plt.figure(figsize=(6, 6))
    y_before_adjust = get_sigmoid(x, k, pivot)
    y_after_adjust = get_sigmoid_s_curve(x, k, pivot)
    plt.plot(x, y_before_adjust, label='before adjust')
    plt.plot(x, y_after_adjust, label='after adjust')
    plt.grid()
    plt.legend(loc='best')
    plt.title('sigmoid adjustment')
    plt.savefig('sigmoid_adjustment.png', dpi=300)


if __name__ == '__main__':
    main()
    main_compare_adjustment()

各种S型曲线设计的特点分析

这里所谓的特点分析只是我自己的一些理解,大家当然是可以有不同看法。

  • 指数型S曲线在两端点处导数值为0,这意味着曲线有比较快的饱和倾向,或者换句话讲,当增强S形态时,两端点处的色彩分辨力会快速下降,一般来说这不是一个好的性质。
  • 基于分段线性函数的S曲线在两端点的分辨力上要好于指数型,但是由于这是分段的,并且其中包含直线成分,尽管曲线处处函数值与一阶导数都连续,但顺滑程度看起来仍然不如其他。
  • 基于sigmoid类型的S曲线尽管有上面提到的诸多问题,但是如果通过限制了参数范围避开这些问题,那么该曲线在端点分辨力上,以及整体顺滑度上都处于一种还不错的状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/601191.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Angular中创建和使用服务

Angular中的服务 文章目录 Angular中的服务前言一、创建服务二、使用服务 前言 Angular 服务是 Angular 应用程序中用于封装可重用逻辑的类。服务在应用程序的多个组件之间共享数据和功能&#xff0c;而不依赖于应用程序的UI。服务可以用于诸如数据处理、与后端通信、用户身份…

电脑显示丢失mfc140u.dll怎么修复,总共有7个方法

mfc140u.dll 是一个动态链接库&#xff08;Dynamic Link Library&#xff09;文件&#xff0c;它是Microsoft Foundation Class (MFC)库的一部分&#xff0c;专为使用C编程语言开发Windows应用程序而设计。MFC库由微软提供&#xff0c;作为一个高级的应用程序框架&#xff0c;旨…

通过 Java 操作 redis -- 连接 redis

如果我们想在本地主机上访问 Linux 服务器上的 redis &#xff0c;我们就需要通过 ssh 进行端口转发&#xff0c;推荐看 本地主机访问服务器的Redis -- 配置 ssh 端口转发 通过 Java 操作 redis 已经有大佬创建了很多第三方库&#xff0c;这里我们使用 jedis &#xff0c;因为它…

N7552A是德科技N7552A电子校准件

181/2461/8938产品概述&#xff1a; 更小巧轻便的 2 端口模块&#xff0c;支持 3.5 mm 或 N 型 50 Ω 连接器&#xff0c;能够将校准时间缩短一半 特点 频率范围&#xff1a;直流至 9 GHz 使用 N 型或 3.5 mm 连接器 更小巧轻便的 2 端口电子校准件&#xff08;ECal&#xff…

Linux:进程等待 进程替换

Linux&#xff1a;进程等待 & 进程替换 进程等待wait接口statuswaitpid接口 进程替换exec系列接口 当一个进程死亡后&#xff0c;会变成僵尸进程&#xff0c;此时进程的PCB被保留&#xff0c;等待父进程将该PCB回收。那么父进程要如何回收这个僵尸进程的PCB呢&#xff1f;父…

《Fundamentals of Power Electronics》——示例:Buck-Boost转换器模型变为正则形式

为了说明正则电路模型推导的步骤&#xff0c;让我们将buck-boost转换器的等效电路操作成规范形式。buck-boost转换器的一个小信号交流等效电路如下图所示。 为了将上图所示网络转换成正则形式&#xff0c;需要将所有独立源d(t)转换到左侧&#xff0c;而将所有电感转换到右侧与变…

PHP 匿名函数和闭包在数据结构中的应用

匿名函数和闭包在数据结构处理中的应用php 中的匿名函数和闭包可用于处理数组、链表和队列等数据结构。针对数组&#xff0c;匿名函数可用于过滤元素&#xff1b;针对链表&#xff0c;闭包可用于创建节点&#xff1b;针对队列&#xff0c;匿名函数和闭包可实现 fifo 队列操作。…

css 文字描边

又是抄样式的一天。这次是百度地图。实现了问题和图形描边的效果。 代码&#xff1a; .BMap_scaleTxt.dark {color: #fff;text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000; } 效果&#xff1a;

uniapp打包的程序在Xcode中运行到模拟器报错的解决方法

uniapp打包的程序在Xcode中运行到模拟器报错的解决方法 问题描述&#xff1a; Building for iOS-simulator, but linking in object file (/Users/hori/Documents/SDK/SDK/Libs/DCUniRecord.framework/DCUniRecord[arm64][3](PGRecord.o)) built for iOS Linker command fail…

翻译《The Old New Thing》- Does Windows have a limit of 2000 threads per process?

Does Windows have a limit of 2000 threads per process? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20050729-14/?p34773 Raymond Chen 2005年07月29日 Windows 是否有一个每个进程2000线程的限制&#xff1f; 简要 文章解释了在 W…

快速搭建linux虚拟机环境

1、虚拟机资源 VMwareWorkstation&#xff1a;Download VMware Workstation Pro virtualbox&#xff1a;Oracle VM VirtualBox 2、虚拟机系统资源 链接&#xff1a;系统资源链接 提取码&#xff1a;0gat 说明&#xff1a;此处的系统资源是采用VMwareWorkstation 虚拟机进…

vue脚手架和vite创建的项目的环境配置

开发环境文件 .env.development NODE_ENV"development" # // 开发接口域名 本地测试就用这个 # vue脚手架创建的 VUE_APP_MODE"开发环境" VUE_APP_API_URL http://19527 # vite创建的 # VITE_MODE"开发环境" # VITE_BASE_URL http://1920:9527…

【自动驾驶|毫米波雷达】逻辑化讲清快时间与慢时间傅里叶变换

碎碎念&#xff1a;实习过程中发现在进行雷达知识交流时&#xff0c;大部分同事都会用英文简称代替中文的一些称呼&#xff0c;比如Chirp、FFT等等。起初我觉得是因为很多英伟达、TI芯片的开发教程都是英文的&#xff0c;所以看得多了大家都习惯这样称呼&#xff0c;后来在和指…

Linux高级学习(前置 在vmware安装centos7.4)

【小白入门 通俗易懂】2021韩顺平 一周学会Linux 此文章包含第006p-第p007的内容 操作 在安装好的vmware下进行安装 这里使用的是vmware15&#xff08;win10下&#xff09;&#xff0c;win11可能无法使用15&#xff08;有几率蓝屏&#xff09;&#xff0c;换成16就行了 用迅雷…

将PT脚本转化为innovus脚本

前一节写的关于PT修时序后吐出相关脚本&#xff0c;但是无法直接使用APR工具innovus进行时序修复&#xff0c;此节介绍一种利用perl脚本将吐出脚本转化为innovus可读的脚本 1.转化前文本形式 2&#xff0c;转化后脚本 3.perl 脚本正文 #&#xff01;/usr/bin/perl #transla…

【完美解决】使用git时候出现error setting certificate verify locations: CAfile:问题

1、出现场景&#xff1a; 在使用idea的时候&#xff0c;进行git下的push&#xff0c;出现下面的错误&#xff1a; 2、原因分析&#xff1a; 可能因为重装过系统&#xff0c;或者是安装git的位置发生了变化等情况出现。 3、解决方案&#xff1a; 找到git的安装路径&#xf…

Layer创建流程

在SurfaceFlinger中&#xff0c;Layer表示一个显示图层&#xff0c;是surfaceflinger合成过程中最重要的基本单元&#xff0c;它提供了一系列属性定义了如何参与合成并与其他Layer交互&#xff0c;包括&#xff1a; 位置&#xff1a;定义Layer出现在屏幕上的位置&#xff0c;包…

回归分析的理解

1.是什么&#xff1a; 2.回归问题的求解&#xff1a; 首先是根据之前的数据确定变量和因变量的关系根据关系去预测目标数据根据结果做出判断 2.1如何找到关系&#xff1f; y’是根据模型生成的预测结果&#xff1a; y’axb&#xff0c;而我们的目的是y’和y(正确的结果)之间…

Innodb实现的索引

概念 一种用于提高数据库查询性能的有序的数据结构。通过使用索引&#xff0c;数据库引擎可以快速定位到存储表中的特定数据&#xff0c;而不必逐行遍历整个表。在处理大量数据的时候可以显著加快数据检索的速度。 通过索引列队数据进行排序&#xff0c;降低数据排序的成本&a…

V23 中的新功能:LEADTOOLS 展示了它的 EXCEL-lence

LEADTOOLS (Lead Technology)由Moe Daher and Rich Little创建于1990年&#xff0c;其总部设在北卡罗来纳州夏洛特。LEAD的建立是为了使Daher先生在数码图象与压缩技术领域的发明面向市场。在过去超过30年的发展历程中&#xff0c;LEAD以其在全世界主要国家中占有的市场领导地位…