图像处理亮度减弱

2018-08-30 15:52:26 qq_35330032 阅读数 6242

1.1基本概念

图像处理的概念是对图像信息进行加工处理,以满足人的视觉心理和实际应用的需求。

模拟图像:连续图像,采用数字化(离散化)表示和数字技术处理之前的图像。

数字图像:由连续的模拟图像采样和量化而得的图像,组成其基本单位是像素。

像素的值代表图像在该位置的亮度或灰度,称为图像的灰度值。

数字图像像素具有整数坐标和整数灰度值。

1.2

图像增强:调整图像的对比度,突出重要细节,改善图像质量。

图像复原和校正:去噪声、去模糊。使得图像能够尽可能地贴近原始图像。

图像的平滑:图像的去噪声处理(通过滤波算法),为了去除实际成像过程中,因成像设备和环境所造成的图像失真,提取有用的信息。

边缘锐化:加强图像的轮廓边缘和细节(一般轮廓边缘都处于灰度突变的地方),通过基于微分锐化算法使灰度反差增强。

图像分割:图像分割就是把图像分成若干个特定的、具有独特性质的区域。

2.1

计算机图像处理的几个内容:

如何对模拟图像进行采样、量化以产生数字图像?

如何压缩图像数据以便存储和传输?

如何对数字图像做各种变换以方便处理?

采样是空间上的离散化,量化是灰度上的离散化。

图像采样就是在水平和垂直方向上等分隔地分割成网状。

量化是在每个采样点上进行的,所以必须先采样后量化。两者都是图像数字化不可或缺的两个操作,两者紧密相关,同时完成。

图像量化实际就是将图像采样后的样本值的范围分为有限多个区域,落入某区域中的值用同一值表示,从而用有限的离散数值量来代替无限的连续模拟量。量化时确定的离散取值个数称为量化级数,表示量化的色彩和亮度值所需的二进制位数称为量化字长,一般量化字长为8位、16位或24位,量化字长越大,越能真实反映原有图像的颜色,但存储的字节也越大。

M、N图像尺寸,K每个像素所具有的离散灰度级数(不同灰度值的个数)

存一幅图像所需的位数(bit)B=M*N*K 减少K值能增强图像的反差。

LENA图是永恒的经典,图像处理领域使用最为广泛的标准测试图。

2.2

图像模式:

1、灰度图像:每个像素的信息由一个量化的灰度级来描述的图像,无彩色信息。

2、黑白图像、二值图像:只有黑白两色没有中间的过渡,像素值为0、1。

3、彩色图像:数据多采用RGB三基色模型,包含亮度和颜色两类信息。

色彩的三要素包括色调(光波的不同波长,反映不同颜色的种类)、饱和度(颜色的纯度,颜色的深浅程度)、亮度(光的明亮程度)。HSL模型

 

2.3

图像文件格式:

BMP文件格式 位图文件格式 由文件头、调色板数据、图像数据三部分组成

GIF  文件格式 存储256色图像

TIFF 文件格式 相对经典、功能很强的图像文件存储格式

JPEG文件格式 静止图像压缩标准文件格式

DICOM  格式 医学图像文件存储格式

2.4图像质量评价

客观评价标准:归一化均方误差NMSE、峰值均方误差PMSE、等效信噪比PSNR

主观评价标准:图像逼真度、图像可懂度

2016-10-16 13:11:12 songyimin1208 阅读数 11355

转载来自:http://blog.sina.com.cn/s/blog_67d185b80101ferj.html


在图像处理中经常遇到需要提高图像亮度或者曝光度的时候,所以我实验了一种比较有效的算法,算法很简单:


I表示要处理的较暗图像,T表示处理后的比较亮的图像
T(x)=I(x)+(1-I(x))*I(x)

算法思想就是通过非线性叠加,增加图像亮度。跟photoshop里的滤色算法差不多。

matlab 代码表示如下:

T=I+(1-I).*I;

T和I都是[0,1]取值的图像。如果一次效果不好算法可以多次迭代。

当然可以在代码中加入一个控制参数K取值[0,1],可以控制亮度的增加强度。
T=I+(1-I).*I.*K;


2019-08-15 12:45:11 Benja_K 阅读数 2855

亮度调整算法说明(完整python代码在文末):

  本算法的基本原理就是对像素点统一进行加上或减去某个调整值,已达到亮度的增强或减弱。包括基于RGB空间R、G、B值的调整和基于HSV空间V值的调整。

  (参考CSDN博客:https://blog.csdn.net/maozefa/article/details/4493395

1. 基于RGB空间亮度调整算法:

  主要是对RGB空间进行亮度调整。计算出调整系数后,调整手段主要有两种:

    1) 基于当前RGB值大小进行调整,即R、G、B值越大,调整的越大, 例如:当前像素点为(100,200,50),调整系数1.1,则调整后为(110,220,55);

    2) 不考虑RGB值大小的影响,即始终对各个点R、G、B值进行相同的调整,例如:当前像素点为(100,200,50),调整系数10/255,则调整后为(110,210,60)。

 

2. 基于HSV空间亮度调整算法:

  主要是对HSV空间的亮度V值进行调整。计算出调整系数后,调整手段主要也有两种:

    1) 基于当前V值大小进行调整,即V值越大,调整的越大,例如:当前像素点V值为200,调整系数1.1,则调整后为220;

    2) 不考虑V值大小的影响,即始终对各个V值进行相同的调整, 例如:当前像素点V值为200,调整系数10/255,则调整后为210。

 

完整python代码如下:

运行方式:打开终端界面,在该py文件目录下,

运行:python  该文件.py  图片路径  亮度等级(-1~1)  调整方式(0或1,默认1)

例如:python  Lightness.py  C:\Users\PDD\Desktop\pdd.jpg  0.3  (1)

 

import cv2
import sys
import numpy as np
import matplotlib.pyplot as plt

"""
  基于RGB空间亮度调整算法:
  主要是对RGB空间进行亮度调整。计算出调整系数后,调整手段主要有两种:
    1) 基于当前RGB值大小进行调整,即R、G、B值越大,调整的越大,
    例如:当前像素点为(100,200,50),调整系数1.1,则调整后为(110,220,55);
    2) 不考虑RGB值大小的影响,即始终对各个点R、G、B值进行相同的调整,
    例如:当前像素点为(100,200,50),调整系数10/255,则调整后为(110,210,60)。
"""
def RGBAlgorithm(rgb_img, value=0.5, basedOnCurrentValue=True):
    img = rgb_img * 1.0
    img_out = img
    
    # 基于当前RGB进行调整(RGB*alpha)
    if basedOnCurrentValue:
        # 增量大于0,指数调整
        if value >= 0 :
            alpha = 1 - value
            alpha = 1/alpha

        # 增量小于0,线性调整
        else:
            alpha = value + 1
            
        img_out[:, :, 0] = img[:, :, 0] * alpha
        img_out[:, :, 1] = img[:, :, 1] * alpha
        img_out[:, :, 2] = img[:, :, 2] * alpha
            
    # 独立于当前RGB进行调整(RGB+alpha*255)
    else:
        alpha = value
        img_out[:, :, 0] = img[:, :, 0] + 255.0 * alpha
        img_out[:, :, 1] = img[:, :, 1] + 255.0 * alpha
        img_out[:, :, 2] = img[:, :, 2] + 255.0 * alpha
        
    img_out = img_out/255.0
    
    # RGB颜色上下限处理(小于0取0,大于1取1)
    mask_3 = img_out  < 0 
    mask_4 = img_out  > 1
    img_out = img_out * (1-mask_3)
    img_out = img_out * (1-mask_4) + mask_4
    
    return img_out

"""
  基于HSV空间亮度调整算法:
  主要是对HSV空间的亮度V值进行调整。计算出调整系数后,调整手段主要有两种:
    1) 基于当前V值大小进行调整,即V值越大,调整的越大,
    例如:当前像素点V值为200,调整系数1.1,则调整后为220;
    2) 不考虑V值大小的影响,即始终对各个V值进行相同的调整,
    例如:当前像素点V值为200,调整系数10/255,则调整后为210。
"""
def HSVAlgorithm(rgb_img, value=0.5, basedOnCurrentValue=True):
    hsv_img = cv2.cvtColor(rgb_img, cv2.COLOR_RGB2HSV)
    img = hsv_img * 1.0
    img_out = img
    
    # 基于当前亮度进行调整(V*alpha)
    if basedOnCurrentValue:
        # 增量大于0,指数调整
        if value >= 0 :
            alpha = 1 - value
            alpha = 1/alpha

        # 增量小于0,线性调整
        else:
            alpha = value + 1
        img_out[:, :, 2] = img[:, :, 2] * alpha
    
    else :
        alpha = value
        img_out[:, :, 2] = img[:, :, 2] + 255.0 * alpha
    
    # HSV亮度上下限处理(小于0取0,大于1取1)
    img_out = img_out/255.0
    mask_1 = img_out  < 0 
    mask_2 = img_out  > 1
    img_out = img_out * (1-mask_1)
    img_out = img_out * (1-mask_2) + mask_2
    img_out = img_out * 255.0
    
    # HSV转RGB
    img_out = np.round(img_out).astype(np.uint8)
    img_out = cv2.cvtColor(img_out, cv2.COLOR_HSV2RGB)
    img_out = img_out/255.0
    
    return img_out

path = './resource/fruit.bmp'
value = 0.3  # 范围-1至1
basedOnCurrentValue = True  # 0或者1

# run : python Lightness.py (path) (value) (basedOnCurrentValue)
if __name__ == "__main__":
    len = len(sys.argv)
    if len >= 2 :
        path = sys.argv[1]
        if len >= 3 :
            value = float(sys.argv[2])
            if len >= 4 :
                basedOnCurrentValue = bool(int(sys.argv[3]))

    img = cv2.imread(path)
    img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    img_rgb = RGBAlgorithm(img, value, basedOnCurrentValue)
    img_hsv = HSVAlgorithm(img, value, basedOnCurrentValue)

    plt.figure("img_original")
    plt.imshow(img/255.0)
    plt.axis('off')

    plt.figure("img_light_rgb")
    plt.imshow(img_rgb)
    plt.axis('off')

    plt.figure("img_light_hsv")
    plt.imshow(img_hsv)
    plt.axis('off')

    plt.show()

 

 

 

2017-07-19 17:32:33 llh_1178 阅读数 8037

处理图像经常会对图像色彩进行增强,这就是改变图像的亮度和对比度。本章基于opencv对图像的亮度和对比度进行处理操作。其实,这是对图像的每一个像素点进行相应的操作。


上面这个公式可以很好的解释对图像的亮度和对比度操作的原理,第一个参数α必须是大于零,不然则基本上没有意义了。α能代表什么呢?α能使图像像素成倍数的增长或降低(α<1),改变了是图像的对比度,因为使图像的差值变化了。那么β作何解释呢?β可为负,也可为正,那么任何一个像素都在(0, 255)之间,加上一个值或减去一个值则会使这个像素点变大或变小,其实就是向白色或向黑色靠近(0为黑,255为白),所以改变的是图像的亮度。

接下来我们用代码演示:

(一)基于Python语言——演示灰色图像的比色度和反差

import cv2
import matplotlib.pyplot as plt
# 反差与对比度
input_image = cv2.imread("Peppers.jpg")
output_gray = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)
output_min_gray = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)
output_max_gray = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)
# 反差图像,cv2.bitwise_not()函数相当于用255减去每一个像素。
output_contrast_image = cv2.bitwise_not(input_image)
for i in xrange(input_image.shape[0]):
    for j in xrange(input_image.shape[1]):
        b = input_image[i, j, 0]
        g = input_image[i, j, 1]
        r = input_image[i, j, 2]
        output_min_gray[i, j] = min(b, min(g, r))
        output_max_gray[i, j] = max(b, min(g, r))

output_image = [output_gray, output_min_gray, output_max_gray, output_contrast_image]
output_titles = ["output_gray", "output_min_gray", "output_max_gray", "output_contrast_image"]
for i in xrange(4):
    plt.subplot(2, 2, (i+1))
    plt.imshow(output_image[i], "gray")
    plt.title(output_titles[i])
    plt.xticks([]), plt.yticks([])
plt.savefig("contrast_gray")


(二)基于C++语言——演示图像的亮度

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

int main(int argc, char* argv) {
	Mat src, dst;
	src = imread("test.jpg");
	if (src.empty()) {
		printf("Could not load image...\n");
		return -1;
	}
	char input_win[] = "input image";
	namedWindow(input_win, CV_WINDOW_AUTOSIZE);
	imshow("input window", src);

	int height = src.rows;
	int width = src.cols;
	dst = Mat::zeros(src.size(), src.type());
        float alpha = 0.8;
	float beta = -20;
	for (int row = 0; row < height; row++) {
		for (int col = 0; col < width; col++) {
			
			float b = src.at<Vec3b>(row, col)[0];
			float g = src.at<Vec3b>(row, col)[1];
			float r = src.at<Vec3b>(row, col)[2];
			// saturate_cast 函数确保像素值在0到255之间。
			dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b*alpha + beta);
			dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g*alpha + beta);
			dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r*alpha + beta);
			
		}
	}
	char output_title[] = "contrast and brightness change demo";
	namedWindow(output_title, CV_WINDOW_AUTOSIZE);
	imshow(output_title, dst);
	
	waitKey(0);
	return 0;
}




2019-08-08 20:09:17 qq_36387683 阅读数 1865

 

 图像亮度、对比度、饱和度和锐化之间并不是彼此独立的,改变其中一个特征可能会同时引起图像其他特征的变化,至于变化的程度取决于图像本身的特性,先建立一个概念,在后面的会在详述

 

1、亮度基本概念


图像亮度通俗理解便是图像的明暗程度,数字图像 f(x,y) = i(x,y) r(x, y) ,如果灰度值在[0,255]之间,则 f 值越接近0亮度越低,f 值越接近255亮度越高。而且我们也要把亮度和对比度区分开来,正如上述提的对比度指的是最高和最低灰度级之间的灰度差。下面通过图片感受一下亮度变化对数字图像的影响:

å¨è¿éæå¥å¾çæè¿°
上面白色和红色两幅图中,图的右边相对于左边增加了亮度,可以看出图像右边相对于左边亮度有了一个整体的提升,这里只是对亮度做了一个小弧度的提升,我们尝试着将亮度提升的更高,如下图:

å¨è¿éæå¥å¾çæè¿°
这里需要强调的是如果我们对亮度做这么一个剧烈的改变,那么便会在改变图片强度的同时也影响了图片的饱和度、对比度和清晰度,此时两个图片右边部分饱和度、对比度和清晰度都降低了,原因是过度增加亮度导致阴影赶上了高光,因为最大灰度值是固定的,所以最低灰度值快赶上了最大灰度值,因此影响了图片的饱和度、对比度和清晰度

2、图像亮度调节示例

  • 图像对比度调节可以直接在RGB空间利用变换公式 g(i,j)= af(i,j) + b 对图像进行线性变化;

对于数字图像变换,设原像素灰度为 f(i,j),转化后的像素灰度为 g(i,j),则常用的线性变换是 g(i,j)= af(i,j) + b, 其中系数 a 影响图像的对比度,系数 b 影响图像的亮度,具体如下:
(1) a=1时是原图;
(2) a>1时对比度增强,图像看起来更加清晰;
(3) a<1时对比度减弱,图像看起来变暗;
(4) b影响图像的亮度,随着增加b (b>0)和减小b (b>0),图像整体的灰度值上移或者下移, 也就是图像整体变亮或者变暗, 不会改变图像的对比度


代码:

import cv2
import imutils
import numpy as np

def c_and_b(arg):
    ''''''
    contrast_num = cv2.getTrackbarPos(trackbar_name1, wname)
    brightness_num = cv2.getTrackbarPos(trackbar_name2, wname)
    #print(bnum)
    cimg = np.ones((img.shape[0], img.shape[1], 3), dtype=np.uint8)
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            lst = 0.1 * contrast_num * img[i, j] + brightness_num
            cimg[i, j] = [int(ele) if ele < 255 else 255 for ele in lst]

    cv2.imshow(wname, imutils.resize(cimg, 800))


wname = 'brightness and contrast'
trackbar_name1 = 'contrast'
trackbar_name2 = 'brightness'
img = cv2.imread(r"E:\yun_project\face_morpher\bieber.jpg")
height, width = img.shape[:2]
img = cv2.resize(img, (int(width/height*400), 400), interpolation=cv2.INTER_CUBIC)

cv2.namedWindow(wname)
cv2.createTrackbar(trackbar_name1, wname, 10, 20, c_and_b)
cv2.createTrackbar(trackbar_name2, wname, 0, 100, c_and_b)

c_and_b(0)

if cv2.waitKey(1) & 0xFF == ord('q'):
    cv2.destroyAllWindows()

 

效果:

 

那么对于两张图像融合时,图像的色调不同, 可以通过调整三色通道,达到调节图像亮度的目的

# 计算指定不规则图像中的平均亮度
def calculate_average_brightness(img):
    # 三色通道的平均值
    B = img[..., 0].mean()
    G = img[..., 1].mean()
    R = img[..., 2].mean()

    # 显示亮度
    brightness = 0.299 * R + 0.587 * G + 0.114 * B
    return brightness, B, G, R

# 计算图像平均亮度调节图像
# 将目标图像的平均亮度调整为源图像的平均亮度
def adjust_brightness_from_src_to_dst(src, dst):
    brightness1, B1, G1, R1 = calculate_average_brightness(src)
    brightness2, B2, G2, R2 = calculate_average_brightness(dst)
    brightness_difference = int(round(brightness1 - brightness2))

    print('原图的平均亮度', brightness1)
    print('目标的平均亮度', brightness2)
    print('原图与目标的亮度差距', brightness_difference)


    # 按照平均显示亮度进行增强
    dstf = dst + brightness_difference

    # 按照三色通道平均值进行增强
    # dstf = dst.copy().astype(np.float32)
    # dstf[..., 0] = dst[..., 0] + (B1 - B2)
    # dstf[..., 1] = dst[..., 1] + (G1 - G2)
    # dstf[..., 2] = dst[..., 2] + (R1 - R2)

    # 对结果进行限制,放置越界,必须转成uint8,不然结果默认为float32,会出错
    dstf = np.clip(dstf, 0, 255)
    dstf = np.uint8(dstf)
    return dstf

按照平均显示亮度进行增强的效果图

按照三色通道平均值进行增强的效果图

推荐文章

https://blog.csdn.net/feilong_csdn/article/details/82755816

https://www.cnblogs.com/skiwnchiwns/p/10130833.html

 

MATLAB中GUI图像处理

阅读数 12266