当前位置: 首页 > news >正文

大气网站背景图家政服务网站建设方案

大气网站背景图,家政服务网站建设方案,策划网络营销活动,wordpress笑话站主题一般来讲#xff0c;图像调色模块都会提供“曲线”工具#xff0c;这是一个极其灵活的功能#xff0c;绝大部分的调色都可以通过该工具实现#xff0c;但是曲线功能的交互相对而言比较复杂。出于简便性和效率方面的考量#xff0c;调色模块往往还会提供一些具有很强的功能…一般来讲图像调色模块都会提供“曲线”工具这是一个极其灵活的功能绝大部分的调色都可以通过该工具实现但是曲线功能的交互相对而言比较复杂。出于简便性和效率方面的考量调色模块往往还会提供一些具有很强的功能倾向性但是交互很简单一个滑竿就可以搞定的功能如“对比度色温色调高光阴影黑点白点等等等等”。 本文要讲的S型曲线就常用于增强对比度对于灰蒙蒙的图片提高对比度能够起到一定去灰增加通透感的作用。 一般来说用于增强对比度的S型曲线要具备以下一些性质 曲线要位于[0, 1]之间。过(0, 0)和(1, 1)两个点。有一个旋转支点位于yx上记为(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} yxp(1−x)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(1−x)[xp(1−x)p]2pxp(1−x)p​ 该曲线的性质 当p1时是正S型曲线当0p1时是反S型曲线当p1时变为yx。旋转支点必为(0.5, 0.5)也就是说该公式没有提供参数可以让我们任意指定旋转支点。支点处的斜率等于p将x0.5代入导数公式即可得。当p1时x0和x1处的导数为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, {0xpivot} \\[2ex] y 1-(1-pivot)(\frac{1-x}{1-pivot})^p, {pivotx1} \end{aligned} yy​pivot(pivotx​)p,0xpivot1−(1−pivot)(1−pivot1−x​)p,pivotx1​ 其导数 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}, {0xpivot} \\[2ex] y p(\frac{1-x}{1-pivot})^{p-1}, {pivotx1} \end{aligned} y′y′​p(pivotx​)p−1,0xpivotp(1−pivot1−x​)p−1,pivotx1​ 该曲线的性质 当p1时是正S型曲线当0p1时是反S型曲线当p1时变为yx。旋转支点为(pivot, pivot)。支点处的斜率等于p且支点处的函数值和斜率都是连续的将xpivot代入上述公式和导数公式即可得。当p1时x0和x1处的导数为0。 使用该曲线调整一张图片示例如下pivot0.435p2上图是原图下图是调节后的效果。 容易看出增加对比度可有效提高图片通透感减弱灰蒙蒙的感觉。 指数型S曲线代码 # -*- coding: utf-8 -*- import cv2 import numpy as np import matplotlib.pyplot as pltdef 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. - pivotreturn 1. - pivot * np.power((1. - x) / pivot, p)def main():pivot 0.4x np.linspace(0, 1, 1000)index_low x pivotindex_high ~index_low# symmetric power style s curveplt.figure(figsize(6, 6))for p in [0.2, 0.5, 1, 2, 5]:y power_symmetric(x, p)plt.plot(x, y, labelpower %0.1f % p)plt.grid()plt.legend(locbest)plt.title(symmetric power style s-curve)plt.savefig(symmetric_power_style_s_curve.png, dpi300)# power style s curvey 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, labelpower %0.1f % p)plt.grid()plt.legend(locbest)plt.title(power style s-curve, pivot%0.1f % pivot)plt.savefig(power_style_s_curve_pivot%0.1f.png % pivot, dpi300)def main_enhance_contrast():pivot 0.435p 2image cv2.imread(gray.jpg)image_adjust image / 255.index image_adjust pivotimage_adjust[index] power_low(image_adjust[index], p, pivot)index ~indeximage_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], axis0)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}, {0x\frac{pivot*k}{k1}} \\[2ex] y k(x-p)p, {\frac{pivot*k}{k1} x \frac{pivot*k1}{k1}} \\[2ex] y \frac{x-1}{k}1, {\frac{pivot*k1}{k1}x1} \end{aligned} yyy​kx​,0xk1pivot∗k​k(x−p)p,k1pivot∗k​xk1pivot∗k1​kx−1​1,k1pivot∗k1​x1​ 三条直线的设计原则比较简单利用点斜式直线公式求解即可 暗部直线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对应的y2k2。这就是我们计算圆弧所需的参数集合(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​−k1​x−x1​​y1​−k2​x−x2​​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_2k_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​k2​−k1​k2​x1​−k1​x2​k1​k2​(y1​−y2​)​−k1​a−x1​​y1​(a−x1​)2(b−y1​)2 ​​ 半圆的方程为 y ± r 2 − ( x − a ) 2 b y \pm \sqrt{r^2 - (x-a)^2}b y±r2−(x−a)2 ​b 注该方法实际可以作为任意两段曲线平滑过渡的通用方案。 该曲线的一些性质 当k1时是正S型曲线当0k1时是反S型曲线当k1时应当直接使用yx注意这里不是退化成yx所以需要写if else语句去直接使用yx因为当k1时圆的方程是无解的。旋转支点为(pivot, pivot)。如果以yx为轴将曲线放平也就是顺时针旋转45度那么两节点之间的曲线凸包是左右对称的。在x0和x1处曲线的导数是1/k因为两端点处仍是直线方程形态。 基于分段线性函数的S型曲线代码 # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as pltdef get_low_line(x, k):return 1 / k * xdef get_high_line(x, k):return 1 / k * (x - 1.) 1.def get_middle_line(x, k, pivot):return k * (x - pivot) pivotdef linear_interpolate(x_beg, x_end, perc):return perc * (x_end - x_beg) x_begdef get_arc_params(x1, y1, k1, x2, y2, k2):a (k2 * x1 - k1 * x2 k1 * k2 * (y1 - y2)) / (k2 - k1)b -(a - x1) / k1 y1r_square (a - x1) * (a - x1) (b - y1) * (b - y1)return a, b, r_squaredef get_low_arc_params(k, pivot, perc):x_border pivot * k / (k 1) # left borderx1 linear_interpolate(x_border, 0, perc) # located at low liney1 get_low_line(x1, k)k1 1 / kx2 linear_interpolate(x_border, pivot, perc) # located at middle liney2 get_middle_line(x2, k, pivot)k2 ka, b, r_square get_arc_params(x1, y1, k1, x2, y2, k2)return a, b, r_square, x1, x2def get_high_arc_params(k, pivot, perc):x_border (pivot * k 1) / (k 1) # right borderx1 linear_interpolate(x_border, pivot, perc) # located at middle liney1 get_middle_line(x1, k, pivot)k1 kx2 linear_interpolate(x_border, 1., perc) # located at high liney2 get_high_line(x2, k)k2 1 / ka, b, r_square get_arc_params(x1, y1, k1, x2, y2, k2)return a, b, r_square, x1, x2def get_arc(x, a, b, r_square, sign):return sign * np.sqrt(r_square - (x - a) * (x - a)) bdef main_line():pivot 0.4x 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_leftindex_mid (x x_border_left) (x x_border_right)index_high x x_border_righty[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, labelk %0.1f % k)plt.grid()plt.legend(locbest)plt.title(piecewise lines, pivot%0.1f % pivot)plt.savefig(piecewise_lines_pivot%0.1f.png % pivot, dpi300)def main_all():pivot 0.4perc 0.5x 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 lineindex (x 0) (x x_low)y[index] get_low_line(x, k)[index]# low-middle arcindex (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 lineindex (x x_mid_left) (x x_mid_right)y[index] get_middle_line(x, k, pivot)[index]# middle-high arcindex (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 lineindex (x x_high) (x 1)y[index] get_high_line(x, k)[index]plt.plot(x, y, labelk %0.1f % k)plt.grid()plt.legend(locbest)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), dpi300)if __name__ __main__:main_line()main_all() 三、基于sigmoid类型函数的S曲线 这里以sigmoid为例具备此类函数性质的其他函数也可以采用类似方案设计如tanh。 sigmoid函数如下 y 1 1 e − x y \frac{1}{1e^{-x}} y1e−x1​ 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}{1e^{-k(x-pivot)}}pivot-0.5 y1e−k(x−pivot)1​pivot−0.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)}}{(1e^{-k(x-pivot)})^2} y′(1e−k(x−pivot))2ke−k(x−pivot)​ 导数还有个简便的计算方法是 y y − ( p i v o t − 0.5 ) y ′ k y ( 1 − y ) y y-(pivot-0.5) \\[2ex] y ky(1-y) yy−(pivot−0.5)y′ky(1−y) pivot用于调节旋转支点就不用多解释了k用于调节S形态的强弱。当pivot0.4k8时示例如下 接下来我们给曲线增加一个随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_max−slope​)2∗y0_diff 在上图蓝线的基础上作如下修正即可得到黄线 y y a d j u s t m e n t y yadjustment yyadjustment 整体效果如下 该曲线的一些性质 该曲线无法退化成严格的yx。k与S形态强弱的对应关系不是很有规律需要单独设计一个k的变化函数。旋转支点为(pivot, pivot)。当pivot离开0.5较远且k较大时上述校正方案会出现穿越[0, 1]区间的情况这是个问题。 基于sigmoid类型函数的S曲线代码如下 # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as pltdef get_sigmoid(x, k, pivot):return 1.0 / (1.0 np.exp(-k * (x - pivot))) pivot - 0.5def 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 - y0y1_diff 1.0 - y1slope0_diff slope_max - slope0slope1_diff slope_max - slope1# process low rangeindex x pivotscale (slope_max - slope) / slope0_diffscale scale ** 2y[index] (y scale * y0_diff)[index]# process high rangeindex ~indexscale (slope_max - slope) / slope1_diffscale scale ** 2y[index] (y scale * y1_diff)[index]return ydef main():pivot 0.4x 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, labelk %0.1f % k)plt.grid()plt.legend(locbest)plt.title(sigmoid style s-curve, pivot%0.1f % pivot)plt.savefig(sigmoid_style_s_curve_pivot%0.1f.png % pivot, dpi300)def main_compare_adjustment():pivot 0.4k 8x 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, labelbefore adjust)plt.plot(x, y_after_adjust, labelafter adjust)plt.grid()plt.legend(locbest)plt.title(sigmoid adjustment)plt.savefig(sigmoid_adjustment.png, dpi300)if __name__ __main__:main()main_compare_adjustment() 各种S型曲线设计的特点分析 这里所谓的特点分析只是我自己的一些理解大家当然是可以有不同看法。 指数型S曲线在两端点处导数值为0这意味着曲线有比较快的饱和倾向或者换句话讲当增强S形态时两端点处的色彩分辨力会快速下降一般来说这不是一个好的性质。基于分段线性函数的S曲线在两端点的分辨力上要好于指数型但是由于这是分段的并且其中包含直线成分尽管曲线处处函数值与一阶导数都连续但顺滑程度看起来仍然不如其他。基于sigmoid类型的S曲线尽管有上面提到的诸多问题但是如果通过限制了参数范围避开这些问题那么该曲线在端点分辨力上以及整体顺滑度上都处于一种还不错的状态。
http://www.zqtcl.cn/news/100659/

相关文章:

  • 河南智能网站建设哪家好重庆在建工程项目
  • 爱站网站长工具网站查看空间商
  • 网站营销活动页面制作wordpress 只显示一个主题
  • 电子网站建设怎么做秦皇岛网站制作公司
  • 网站建站模板样例平台推广怎么做
  • 网站建设首选亿企联盟做网站宣传有用吗
  • 网站建设公司行业苏州高端网站建设咨询
  • 电商平台网站开发过程江苏省建设科技发展中心网站简介
  • 空间租用 网站开发重庆手机网站推广资料
  • 新余 网站建设网站建设行业新闻
  • 做301网站打不开网上智慧团建网站
  • 四川省住房与城乡建设厅官方网站免费域名解析ip
  • 芜湖网站建设价格这么做网站原型图
  • 做传奇网站怎么弄的南京微网站开发
  • 网站建设基础教程人教版网站域名选择的原则
  • u盘做网站网站建设公司公司介绍
  • 嘉兴网站排名优化报windows wordpress 轻量级
  • html5网站开发方案海珠网站建设公
  • 津做网站建筑网课平台
  • 佛山制作手机网站汕头网站定制
  • 网站域名解释怎么做济南集团网站建设
  • 网站怎么做咨询网站开发商
  • 建立网站的第一步网站的管理系统
  • 安远做网站做宣传册网站
  • 网站建设概况君隆网站建设
  • 富源县住房和城乡建设局网站备案信息 网站名
  • 做门窗的网站宁波附近的seo推广
  • 上海网站建设解决方案怎样设计网站
  • 龙华建站公司seo研究中心怎么样
  • 网站的大图标怎么做项目网站