2020-01-06 22:10:26 qiu931110 阅读数 15

你真的了解对比度吗?对比度是数字图像中非常基本的概念,一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,即指一幅图像灰度反差的大小。直白的说就是:对比度大整体的色彩更鲜艳,对比度小色彩感更平淡。接下来我们用像素直方图的例子来形象的展示对比度大小在图像上的差异。

1.整体实现代码
from PIL import Image
from PIL import ImageEnhance
import matplotlib.pyplot as plt
import numpy as np

def get_piexl_list(img):
    w, h = img.size[0], img.size[1]
    img_list = img.load()
    r_list = []
    g_list = []
    b_list = []
    for i_w in range(w):
        for j_h in range(h):
            r, g, b = img_list[i_w, j_h]
            r_list.append(r)
            g_list.append(g)
            b_list.append(b)

    r_list = np.asarray(r_list)
    g_list = np.asarray(g_list)
    b_list = np.asarray(b_list)
    return r_list,g_list,b_list

def draw_mulit_pic(r_list,g_list,b_list):
    fig, ax = plt.subplots()
    ax = fig.add_subplot(311)
    ax2 = fig.add_subplot(312)
    ax3 = fig.add_subplot(313)

    ax.hist(r_list, bins=256, normed=True, color='yellow')
    ax2.hist(g_list, bins=256, normed=True, color='red')
    ax3.hist(b_list, bins=256, normed=True, color='blue')

    plt.show()

def enhance_contrast(img):
    enh_con = ImageEnhance.Contrast(img)
    contrast = 1.5
    img_contrasted = enh_con.enhance(contrast)
    img_contrasted.show()
    return img_contrasted

if __name__ == "__main__":
    img = Image.open('D:\\1.jpeg')

    # 原始图像直方图
    r_list,g_list,b_list = get_piexl_list(img)
    draw_mulit_pic(r_list, g_list, b_list)

    # 对比度增强
    img_contrasted = enhance_contrast(img)

    # 对比度增强后图像直方图
    r_list,g_list,b_list = get_piexl_list(img_contrasted)
    draw_mulit_pic(r_list, g_list, b_list)

2.原始图像直方图
    img = Image.open('D:\\1.jpeg')

    # 原始图像直方图
    r_list,g_list,b_list = get_piexl_list(img)
    draw_mulit_pic(r_list, g_list, b_list)

利用上述代码画出原始图像的像素直方图,从下图的直方图中可以观察到,直方图差异比较大,起伏比较大。
原始图像直方图

3.增强后图像直方图
    # 对比度增强
    img_contrasted = enhance_contrast(img)

    # 对比度增强后图像直方图
    r_list,g_list,b_list = get_piexl_list(img_contrasted)
    draw_mulit_pic(r_list, g_list, b_list)

利用PIL库自带的对比度增强策略对图像进行增强,并重新将直方图画出来,从增强后的直方图可以看到,整体的像素分布会比较均匀。
对比度增强后直方图

4.对比度增强结果显示

我乔神和奥胖仿佛做了美黑!

2018-09-08 09:33:49 qq_37385726 阅读数 10585

目录

 

饱和度

色调

对比度

 

转自这里

 


图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。图像处理技术的一般包括图像压缩,增强和复原,匹配、描述和识别3个部分。 常见的系统有康耐视系统、图智能系统等,目前是正在逐渐兴起的技术。

在图像处理中,常见的颜色模型包括HSB(色相、饱和度、亮度)、RGB(红色、绿色、蓝色)、CMYK(青色、品红、黄色、黑色)和CIE等,因此,相应的颜色模式也就有RGB、CMYK、Lab等。在HSB颜色模型中,色相、饱和度、对比度是对图像属性的基本描述。

饱和度

饱和度可定义为彩度除以明度,与彩度同样表征彩色偏离同亮度灰色的程度。注意,与彩度完全不是同一个概念。但由于其和彩度决定的是出现在人眼里的同一个效果,所以才会出现视彩度与饱和度为同一概念的情况。

饱和度是指色彩的鲜艳程度,也称色彩的纯度。饱和度取决于该色中含色成分和消色成分(灰色)的比例。含色成分越大,饱和度越大;消色成分越大,饱和度越小。纯的颜色都是高度饱和的,如鲜红,鲜绿。混杂上白色,灰色或其他色调的颜色,是不饱和的颜色,如绛紫,粉红,黄褐等。完全不饱和的颜色根本没有色调,如黑白之间的各种灰色。

saturation

用以估价纯彩色在整个色觉(包括无彩色)中的成分的视觉属性。它与濒色的纯度这一物理心理里有关(或近似相关)。它决定于颜色光中所混入的白色光的数里,纯光谱色的含量愈多,则它愈高。

色调

色调指的是一幅画中画面色彩的总体倾向,是大的色彩效果。在大自然中,我们经常见到这样一种现象:不同颜 色的物体或被笼罩在一片金色的阳光之中,或被笼罩在一片轻纱薄雾似的、淡蓝色的月色之中;或被秋天迷人的金黄色所笼罩;或被统一在冬季银白色的世界之中。这种在不同颜色的物体上,笼罩着某一种色彩,使不同颜色的物体都带有同一色彩倾向,这样的色彩现象就是色调。

基本含义

色调是指物体反射的光线中以哪种波长占优势来决定的,不同波长产生不同颜色的感觉,色调是颜色色调的重要特征,它决定了颜色本质的根本特征。

色调不是指颜色的性质,而是对一幅绘画作品的整体颜色的概括评价。色调是指一幅作品色彩外观的基本倾向。在明度、纯度(饱和度)、色相这三个要素中,某种因素起主导作用,我们就称之为某种色调。一幅绘画作品虽然用了多种颜色,但总体有一种倾向,是偏蓝或偏红,是偏暖或偏冷等等。这种颜色上的倾向就是一副绘画的色调。通常可以从色相、明度、冷暖、纯度四个方面来定义一幅作品的色调。

色调在冷暖方面分为暖色调与冷色调:红色、橙色、黄色--为暖色调,象征着:太阳、火焰。蓝色--为冷色调,象征着:森林、大海、蓝天。黑色、紫色、绿色、白色--为中间色调; 暖色调的亮度越高,其整体感觉越偏暖,冷色调的亮度越高,其整体感觉越偏冷。冷暖色调也只是相对而言,譬如说,红色系当中,大红与玫红在一起的时候,大红就是暖色,而玫红就被看作是冷色,又如,玫红与紫罗蓝同时出现时,玫红就是暖色。

对比度

对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,差异范围越大代表对比越大,差异范围越小代表对比越小,好的对比率120:1就可容易地显示生动、丰富的色彩,当对比率高达300:1时,便可支持各阶的颜色。但对比率遭受和亮度相同的困境,现今尚无一套有效又公正的标准来衡量对比率,所以最好的辨识方式还是依靠使用者眼睛。

在暗室中,白色画面(最亮时)下的亮度除以黑色画面(最暗时)下的亮度。更精准地说,对比度就是把白色信号在100%和0%的饱和度相减,再除以用Lux(光照度,即勒克斯,每平方米的流明值)为计量单位下0%的白色值(0%的白色信号实际上就是黑色),所得到的数值。对比度是最白与最黑亮度单位的相除值。因此白色越亮、黑色越暗,对比度就越高。严格来讲我们指的对比度是屏幕上同一点最亮时(白色)与最暗时(黑色)的亮度的比值,不过通常产品的对比度指标是就整个屏幕而言的,例如一个屏幕在全白屏状态时候亮度为500cd/m2,全黑屏状态亮度为0.5cd/m2,这样屏幕的对比度就是1000:1。返回搜狐,查看

2013-11-10 14:10:34 jiangyinglin198812 阅读数 8468

要调整正图片的亮度和对比度, 首先要知道亮度和对比度的定义:

“明度”(Brightness)原来用做光度测定术语照度和(错误的)用于辐射测定术语辐射度的同义词。按美国联邦通信术语表(FS-1037C)的规定,明度现在只应用于非定量的提及对光的生理感觉和感知。[1]

一个给定目标亮度在不同的场景中可以引起不同的明度感觉;比如White错觉Wertheimer-Benary错觉

在 RGB 色彩空间中,明度可以被认为是 R(红色),G(绿色)和B(蓝色)座标的算术平均 μ(尽管这三个成分中的某个要比其他看起来更明亮,但这可以被某些显示系统自动补偿):

 \mu = {R + G + B \over 3 }
即: dst[i] = (src[i + 0] + src[i + 1] + src[i + 2]) / 3 (三通道图片)

明度也是 HSB 或 HSV 色彩空间色相饱和度和明度)中的颜色坐标,它的值是这个颜色的 RG 和 B 三者中的极大值。

 对比度,具体的概念解释可以参考Wiki或者百度百科。简单的讲对比度反应了图片上亮区域和暗区域的层次感。而反应到图像编辑上,调整对比度就是在保证平均亮度不变的情况下,扩大或缩小亮的点和暗的点的差异。既然是要保证平均亮度不变,所以对每个点的调整比例必须作用在该值和平均亮度的差值之上,这样才能够保证计算后的平均亮度不变,故有调整公式:

                                  Out = Average + (In – Average) * ( 1 + percent)

其中In表示原始像素点亮度,Average表示整张图片的平均亮度,Out表示调整后的亮度,而percent即调整范围[-1,1]。证明这个公式的正确性相当简单:

设图上有n个像素点,各个点亮度为Ai,平均亮度为A,变化率为alpha,则有:

CodeCogsEqn (1)

    但是实际处理中,并没有太多的必要去计算一张图的平均亮度:一来耗时间,二来在平均亮度上的精确度并不会给图像的处理带来太多的好处—-一般就假设一张图的平均亮度为128,即一半亮度,而一张正常拍照拍出来的图平均亮度应该是在[100,150]。在肉眼看来两者基本没有任何区别,而如果真实地去计算平均亮度还会带来很大的计算量。、

即: dst[i] = 128 + (src[i] – 128) * (nPercent)    // nPercent = 1 + percent

简单示例:

#include "highgui.h"
#pragma comment(lib,"cv200d.lib")
#pragma comment(lib,"cxcore200d.lib")
#pragma comment(lib,"highgui200d.lib")
 
int BrightnessAdjust(const IplImage* srcImg,
                     IplImage* dstImg,
                     float brightness)
{
    assert(srcImg != NULL);
    assert(dstImg != NULL);
 
    int x,y,i;
    float val;
    for (i = 0; i < 3; i++)//彩色图像需要处理3个通道,灰度图像这里可以删掉
    {
        for (y = 0; y < srcImg->height; y++)
        {
            for (x = 0; x < srcImg->width; x++)
            {
 
                val = ((uchar*)(srcImg->imageData + srcImg->widthStep*y))[x*3+i];
                val += brightness;
                //对灰度值的可能溢出进行处理
                if(val>255)    val=255;
                if(val<0) val=0;
                ((uchar*)(dstImg->imageData + dstImg->widthStep*y))[x*3+i] = (uchar)val;
            }
        }
    }
 
    return 0;
}
 
int ContrastAdjust(const IplImage* srcImg,
                   IplImage* dstImg,
                   float nPercent)
{
    assert(srcImg != NULL);
    assert(dstImg != NULL);
 
    int x,y,i;
    float val;
    for (i = 0; i < 3; i++)//彩色图像需要处理3个通道,灰度图像这里可以删掉
    {
        for (y = 0; y < srcImg->height; y++)
        {
            for (x = 0; x < srcImg->width; x++)
            {
 
                val = ((uchar*)(srcImg->imageData + srcImg->widthStep*y))[x*3+i];
                val = 128 + (val - 128) * nPercent;
                //对灰度值的可能溢出进行处理
                if(val>255) val=255;
                if(val<0) val=0;
                ((uchar*)(dstImg->imageData + dstImg->widthStep*y))[x*3+i] = (uchar)val;
            }
        }
    }
    return 0;
}
 
int main(int argc, char** argv)
{
    IplImage* srcImg = cvLoadImage("lena.jpg");
    assert( srcImg != NULL );
 
    IplImage* brightnessImg = cvCloneImage(srcImg);
    //亮度变换,最后数值取值为正时变亮,负则变暗
    BrightnessAdjust(srcImg, brightnessImg, 80.0f);
 
    IplImage* contrastImg = cvCloneImage(srcImg);
    //对比度变换,数值小于1降低对比度,大于1增强对比度
    ContrastAdjust(srcImg, contrastImg, 1.3f);
 
    cvNamedWindow("Source",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("BrightnessAdjust",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("ContrastAdjust",CV_WINDOW_AUTOSIZE);
    cvShowImage("Source",srcImg);
    cvShowImage("BrightnessAdjust",brightnessImg);
    cvShowImage("ContrastAdjust",contrastImg);
    cvWaitKey(0);
    cvReleaseImage(&srcImg);
    cvReleaseImage(&brightnessImg);
    cvReleaseImage(&contrastImg);
    cvDestroyWindow("Source");
    cvDestroyWindow("BrightnessAdjust");
    cvDestroyWindow("ContrastAdjustrast");
 
    return 0;
}

结果:

并且与photoshop的调整效果对比过
亮度变换与ps旧版效果一致,貌似ps对亮度变换的公式进行过调整,新版不是这么单纯的加减灰度值对比度就几乎都差不多了


在《Delphi图像处理 -- 亮度/对比度调整》一文实现了Photoshop的亮度/对比度调整功能,这是其C/C++版。

    还是先简单介绍一下Photoshop图像亮度/对比度调整的原理:

 一、Photoshop对比度算法。可以用下面的公式来表示:

    (1)、nRGB = RGB + (RGB - Threshold) * Contrast / 255

    公式中,nRGB表示图像像素新的R、G、B分量,RGB表示图像像素R、G、B分量,Threshold为给定的阀值,Contrast为处理过的对比度增量。

    Photoshop对于对比度增量,是按给定值的正负分别处理的:

    当增量等于-255时,是图像对比度的下端极限,此时,图像RGB各分量都等于阀值,图像呈全灰色,灰度图上只有1条线,即阀值灰度;

    当增量大于-255且小于0时,直接用上面的公式计算图像像素各分量;

    当增量等于 255时,是图像对比度的上端极限,实际等于设置图像阀值,图像由最多八种颜色组成,灰度图上最多8条线,即红、黄、绿、青、蓝、紫及黑与白;

    当增量大于0且小于255时,则先按下面公式(2)处理增量,然后再按上面公式(1)计算对比度:

    (2)、nContrast = 255 * 255 / (255 - Contrast) - 255

    公式中的nContrast为处理后的对比度增量,Contrast为给定的对比度增量。

    二、图像亮度调整。本文采用的是最常用的非线性亮度调整(Phoposhop CS3以下版本也是这种亮度调整方式,CS3及以上版本也保留了该亮度调整方式的选项),本文亮度调整采用MMX,对亮度增量分正负情况分别进行了处理,每次处理2个像素,速度相当快,比常规BASM代码的亮度处理过程还要快几倍(参见《GDI+ 在Delphi程序的应用 -- 调整图像亮度》)。

    三、图像亮度/对比度综合调整算法。这个很简单,当亮度、对比度同时调整时,如果对比度大于0,先调整亮度,再调整对比度;当对比度小于0时,则相反,先调整对比度,再调整亮度。

 下面是用BCB2007和GDI+位图数据写的Photoshop图像亮度/对比度调整代码,包括例子代码:

//---------------------------------------------------------------------------
FORCEINLINE
INT CheckValue(INT value)
{
	return (value & ~0xff) == 0? value : value > 255? 255 : 0;
}
//---------------------------------------------------------------------------
// 亮度/对比度调整
VOID BrightAndContrast(BitmapData *data, INT bright, INT contrast, BYTE threshold)
{
	if (bright == 0 && contrast == 0)
		return;
	FLOAT cv = contrast <= -255? -1.0f : contrast / 255.0f;
	if (contrast > 0 && contrast < 255)
		cv = 1.0f / (1.0f - cv) - 1.0f;
	BYTE values[256];
	for (INT i = 0; i < 256; i ++)
	{
		INT v = contrast > 0? CheckValue(i + bright) : i;
		if (contrast >= 255)
			v = v >= threshold? 255 : 0;
		else
			v = CheckValue(v + (INT)((v - threshold) * cv + 0.5f));
		values[i] = contrast <= 0? CheckValue(v + bright) : v;
	}
	PARGBQuad p = (PARGBQuad)data->Scan0;
	INT offset = data->Stride - data->Width * sizeof(ARGBQuad);
	for (UINT y = 0; y < data->Height; y ++, (BYTE*)p += offset)
	{
		for (UINT x = 0; x < data->Width; x ++, p ++)
		{
			p->Blue		= values[p->Blue];
			p->Green	= values[p->Green];
			p->Red		= values[p->Red];
		}
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Gdiplus::Bitmap *bmp =  new Gdiplus::Bitmap(L"..\\..\\media\\source1.jpg");
	Gdiplus::Graphics *g = new Gdiplus::Graphics(Canvas->Handle);
	g->DrawImage(bmp, 0, 0);
	BitmapData data;
	LockBitmap(bmp, &data);
	BrightAndContrast(&data, 0, 255, 121);
	UnlockBitmap(bmp, &data);
	g->DrawImage(bmp, data.Width, 0);
	delete g;
	delete bmp;
}
//---------------------------------------------------------------------------

2019-07-17 15:38:42 space_walk 阅读数 277

一幅图像中,最高灰度级和最低灰度级的差成为对比度。一幅低对比度的图像,看起来细节会少很多。可以通过对比度拉伸提高图像对比度,显示更多细节。先来看看对比度拉伸的典型变换:
对比度拉伸典型变换
书本中(冈萨雷斯:数字图像处理第三版P69)的对比度拉伸变换函数图是这样的:

书中对比度拉伸变换函数图
图3.10(b)低对比度拉伸图中,最低灰度级为91,最高灰度级为138,并且要将灰度值拉伸至[0, 255]。阈值处理的函数的图像即为P64图3.2第二个图像,其中k = 109。
实验代码如下:

% 读入图像
img_1 = imread('Fig0310(b)(washed_out_pollen_image).tif');

% max():返回一个行向量,向量的第i个元素是矩阵A的第i列上的最大值。
% 再一次即可求得最高灰度级
r_max = max(max(img_1));
%max() 同理
r_min = min(min(img_1));

% 求输入图像的尺寸
[r, c] = size(img_1);

% 生成两张0图,一张用于对比度拉伸,一张用于阈值处理
img_2 = zeros(r, c);
img_3 = zeros(r, c);

% 将输入图像转换成double型
img_1s = double(img_1);

% 计算斜率
k = (255 - 0) / (r_max - r_min);
% 灰度级总和
sum = 0;

for x = 1 : r
    for y = 1 : c
        % 对每个像素点进行拉伸,并赋值到新图像
        img_2(x, y) = k * (img_1s(x, y) - r_min);
        % 求灰度级总和
        sum = sum + img_1s(x, y);
    end
end

% 求阈值,这里阈值为平均值
avg = sum / (r * c);

% 阈值处理
for x = 1 : r
    for y = 1 : c
        % 小于阈值赋值0
        if img_1s(x, y) < avg
             img_3(x, y) = 0;
         % 大于阈值赋值1
        else
            img_3(x, y) = 1;
        end
    end
end

% 转换
img_2 =  im2uint8(mat2gray(img_2));
img_3 =  im2uint8(mat2gray(img_3));
% 显示
subplot(131), imshow(img_1);
subplot(132), imshow(img_2);
subplot(133), imshow(img_3);

结果如下:
结果对比

2019-06-16 16:04:49 qq_38269799 阅读数 250

对比度增强

提前规定:输入图像为?,宽为?,高为?,输出图像?,??,?为输入图像?的 ?行?列像素灰度级,??,?为输出图像?的?行?列像素灰度级,0≤?≤?,0≤?≤?

 

灰度直方图

灰度直方图描述了一幅图像中每个灰度级在图像中占据的像素个数或者是比率,利用灰度直方图,通过数学方法,我们可以很容易的实现图像的处理

1.1线性变换

输入图像为?,宽为?,高为?,输出图像? ,图像的线性变换可以表示为

??,?=?∗??,?+?,0≤?≤?,0≤?≤?

优点:简单易懂

缺点:通过该方法可以调整图像的对比度,但是参数?,?需要根据自己实际图像进行多次测试来确定,比较繁琐

 

1.2直方图正则化

直方图正则化,依据了统计学原理,来进行图像的对比度调整:

一般规定????=255;????=0

 

优点:直方图正规化自动选取?,?的线性变换

缺点:1.变换后图像的灰度级减少,某些细节消失;2.某些图像,如直方图有高峰,经处理后对比度不自然的过分增强

 

 

1.3 伽马变换

 

伽马变换的方法,首先将灰度值诡异到[0.1]范围,??,?表示归一化之后的像素值

??,?=??,??,0≤?≤?,0≤?≤?

输出图像不变:伽马=1

输入图像整体过暗,可以调整令 0<γ<1, 来增加对比度

输入图像整体过暗,  可以调整令   γ>1对比度

优点:提升对比度效果比较好

缺点:需要手动调整γ值

 

1.4 全局直方图均衡

原图 ? 的直方图是各个像素级分布不均匀,导师对比度出现问题,全局直方图均衡使得输出图像?的像素均匀分布在每一像素级别,输出图像?的对比度达到一个比较好的效果。

全局直方图均衡就是在做这个工作,找出亮度级别为p的输入像素到亮度级别为q的输出像素的映射,最终使得输出图像?的像素均匀分布在每一像素级别。

所以推得:

1.5限制对比度的自适应直方图均衡化

将图形划分为不重叠的区域,单独对每个区域做直方图均衡化。为了避免每个区域中的噪声被放大,使用限制对比度的方法,某点像素值超过了该区域的限制对比度,则将起均匀分配给该区域中其他的像素点。

没有更多推荐了,返回首页