可以看到,三个通道的像素值大多分布在0到20之间,所以图像呈现极暗。图像的亮度也是与像素值挂钩,像素值越大,则一般而言,影像会越亮,那是不是对每个像素值加一定值就可以调整亮度呢?
答案是否定的,若直接将像素值加上200,则结果图像会变白,但是地物依然无法识别,这是因为像素值之间的差别很小,可能像素值5代表的是灰色的屋顶,6代表的是绿色的草地,但是在像素值变大后变为205与206,看起来都是白色,所以无法展示实际影像。
上述的是影像的亮度调整,所以还需要影像的对比度调整。
影像的对比度指的是间隔,在调大像素值的同时增加像素值之间的间隔,则会得到较好的结果。
先展示自适应调整后的结果:
下面讲解具体python实现。
讲道理,先import库,读图片。
import numpy as np
import cv2
def compute(img, min_percentile, max_percentile):
"""计算分位点,目的是去掉图1的直方图两头的异常情况"""
max_percentile_pixel = np.percentile(img, max_percentile)
min_percentile_pixel = np.percentile(img, min_percentile)
return max_percentile_pixel, min_percentile_pixel
def aug(src):
"""图像亮度增强"""
if get_lightness(src)>130:
print("图片亮度足够,不做增强")
# 先计算分位点,去掉像素值中少数异常值,这个分位点可以自己配置。
# 比如1中直方图的红色在0到255上都有值,但是实际上像素值主要在0到20内。
max_percentile_pixel, min_percentile_pixel = compute(src, 1, 99)
# 去掉分位值区间之外的值
src[src>=max_percentile_pixel] = max_percentile_pixel
src[src<=min_percentile_pixel] = min_percentile_pixel
# 将分位值区间拉伸到0到255,这里取了255*0.1与255*0.9是因为可能会出现像素值溢出的情况,所以最好不要设置为0到255。
out = np.zeros(src.shape, src.dtype)
cv2.normalize(src, out, 255*0.1,255*0.9,cv2.NORM_MINMAX)
return out
def get_lightness(src):
# 计算亮度
hsv_image = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
lightness = hsv_image[:,:,2].mean()
return lightness
img = cv2.imread(r"data/test.png")
img = aug(img)
cv2.imwrite('out.png', img)
文章结构在这篇文章内,你能了解到以下内容:图像的灰度直方图图像的亮度调整1.图像的直方图一张图像一般由RGB三个通道(红色、绿色、蓝色三个部分)组成。单独对某个通道而言,把一幅图像中每一个像素出现的次数都统计出来,然后把每一个像素出现的次数除以总的像素个数,得到的就是这个像素出现的频率,然后再把该像素出现的频率用图表示出来,就构成了灰度直方图。图像直方图由于其计算代价较小,且具有图...
这是2018年写的第一篇关于opencv的文章,考虑到图像增强对于初学者来说比较容易理解,因此从该方向入手,通过一些程序案例,分析图像增强的原理并展示效果。
首先,什么是图像增强?
图像增强就是通过对像素值局部或整体的变换,使得原来特征不明显的部分显得更加突出,并且抑制一些用户不感兴趣的特征,这样图像的价值将会更加明显。
举个例子:小明喜欢拍照,逆光拍摄了一组照片,结果照片整体很暗,勉强可以看
def imgBrightness(img1, c, b):
rows, cols, channels = img1.shape
blank = np.zeros([rows, cols, channels], img1.dtype)
rst = cv2.addWeighted(img1, c, blank, 1-c, b)
return rst
img = cv2.imread('D:/Learning/FrNe
彩色图像自适应对比度增强
事实上很多博文都有描叙这个,但都不愿公开完全代码,这里贴上我实现的代码。
首先对算法说明一些,如果直接按公式来,算法的复杂度就是n^2 * N^2 , 其中n为窗口大小,N为图像大小,但是我们可以很容易发现,可以通过已计算前值来计算后面的值,其中
M(x, y) = M(x, y-1) +{ SUM[f(xr)] - SUM[f...
这里用 Python 实现 PS 图像调整中的明度调整:
我们知道,一般的非线性RGB亮度调整只是在原有R、G、B值基础上增加和减少一定量来实现的,而PS的明度调整原理还得从前面那个公式上去找。我们将正向明度调整公式:
RGB = RGB + (255 - RGB) * value / 255
RGB = (RGB * (255 - value) + 255 * value) / 255,...
2、代码部分,我们依然使用到上篇文章中介绍的数据批处理模式:
from PIL import Image
from skimage import exposure, img_as_float, io
import os
old_path = r"E:\relate_code\frame_resize" #
b, g, r = cv2.split(img)
# 对每个通道进行处理
b = cv2.adaptiveThreshold(b, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, kernel_size, delta)
g = cv2.adaptiveThreshold(g, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, kernel_size, delta)
r = cv2.adaptiveThreshold(r, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, kernel_size, delta)
# 合并通道
img = cv2.merge([b, g, r])
return img
其中,`cv2.adaptiveThreshold` 函数用于对单通道图像进行自适应阈值处理,`cv2.split` 函数将彩色图像分离为三个通道,`cv2.merge` 函数将处理后的三个通道合并为一张彩色图像。
调用示例:
```python
img = cv2.imread('test.jpg')
result = adaptive_mean_filter(img)
cv2.imshow('original', img)
cv2.imshow('result', result)
cv2.waitKey()
cv2.destroyAllWindows()
其中,`test.jpg` 是待处理的彩色图像。