<p>Python/OpenCV可以使用min_max normalization通过cv2.normalize()方法进行对比拉伸。例如:</p>
<p>输入:</p>
<p><a href="https://i.stack.imgur.com/4JC1c.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/4JC1c.jpg" alt="enter image description here"/></a></p>
<pre><code>#!/bin/python3.7
import cv2
import numpy as np
# read image
img = cv2.imread("zelda3_bm20_cm20.jpg", cv2.IMREAD_COLOR)
# normalize float versions
norm_img1 = cv2.normalize(img, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
norm_img2 = cv2.normalize(img, None, alpha=0, beta=1.2, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
# scale to uint8
norm_img1 = (255*norm_img1).astype(np.uint8)
norm_img2 = np.clip(norm_img2, 0, 1)
norm_img2 = (255*norm_img2).astype(np.uint8)
# write normalized output images
cv2.imwrite("zelda1_bm20_cm20_normalize1.jpg",norm_img1)
cv2.imwrite("zelda1_bm20_cm20_normalize2.jpg",norm_img2)
# display input and both output images
cv2.imshow('original',img)
cv2.imshow('normalized1',norm_img1)
cv2.imshow('normalized2',norm_img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
</code></pre>
<p><br/>
标准化1:</p>
<p><a href="https://i.stack.imgur.com/5Avkb.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/5Avkb.jpg" alt="enter image description here"/></a></p>
<p>标准化2:</p>
<p><a href="https://i.stack.imgur.com/X5zZM.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/X5zZM.jpg" alt="enter image description here"/></a></p>
<p>你也可以用一个简单的线性方程来做你自己的拉伸,这个方程有2对输入/输出值,形式是y=a*x+B,并求解这两个联立方程。参见<a href="https://stackoverflow.com/questions/59504637/how-can-i-make-the-gradient-appearance-of-one-image-equal-to-the-other/59506090#59506090">How can I make the gradient appearance of one image equal to the other?</a>中所示的拉伸概念</p>