图像处理中灰度调整

2019-10-14 09:17:53 weixin_35732969 阅读数 352

灰度变换对图像中单个像素进行处理,它的数学表示:

s = T(r).

其中s和r分别表示处理前后的像素值,T是把像素值r映射到s的一种变换。

一些基本的灰度变换函数:线性函数对数函数幂律函数。如下图:

反转变换

s = L - 1 - r 

可以看出来是一种黑白颠倒,灰度级范围是[0,L-1]。

对数变换的通用形式:

s = c\mathbf{log}(1+r)

它将输入中范围较窄的低灰度值映射为输出中较宽范围的灰度值,用来扩展图像中的暗像素值,同时压缩更高灰度级的值。

幂律变换(伽马变换)的基本形式:

s = cr^{\gamma }

部分\gamma值将较窄范围的暗色输入值映射为较宽范围的输出值,与对数函数不同的是,随着\gamma的变化,将得到一族可能的变换曲线,如下图:

可以看出,\gamma >0\gamma <0的值所生成的曲线的效果完全相反。

有时需要突出图像中特定灰度范围的亮度,可以使用灰度级分层的处理。一种方法是将感兴趣范围内的所有灰度值显示为一个值(如“白色”),其他灰度值显示为另一个值(如“黑色”),即产生一幅二值图像;另一种方法将感兴趣范围的灰度变亮(或变暗),保持其他灰度值不变。两种方法的变换函数如下图:

 比特平面分层:一幅8比特的图像可以考虑为由8个1比特平面组成,如下图:

 其中平面1 包含图像中所有像素的最低阶比特,平面8包含图像中所有像素的最高阶比特。

举个例子:

图a是一幅8比特灰度图像,b~i是其8个1比特平面。可以看出,最后两个高阶比特平面包含了视觉上很重要的大多数数据,低阶比特平面贡献更精细的灰度细节。

标题
标题

参考资料:冈萨雷斯《数字图像处理》

2019-06-16 23:23:00 Geeksongs 阅读数 2682

数字图像处理:图像的灰度变换(Matlab实现)

(1)线性变换:
通过建立灰度映射来调整源图像的灰度。

k>1增强图像的对比度;k=1调节图像亮度,通过改变d值达到调节亮度目的;0

i = imread('theatre.jpg');
i = im2double(rgb2gray(i));
[m,n]=size(i);
%增加对比度
Fa = 1.25; Fb = 0;
O = Fa.*i + Fb/255;
figure(1), subplot(221), imshow(O);
title('Fa = 1.25, Fb = 0, contrast increasing');
figure(2),subplot(221), [H,x]=imhist(O, 64);
stem(x, (H/m/n), '.');
title('Fa = 1.25, Fb = 0, contrast increasing');
%减小对比度
Fa =0.5; Fb = 0;
O = Fa.*i + Fb/255;
figure(1), subplot(222),imshow(O);
title('Fa = 0.5, Fb = 0, contrast decreasing');
figure(2), subplot(222), [H,x] = imhist(O, 64);
stem(x, (H/m/n), '.');
title('Fa = 0.5, Fb = 0, contrast decreasing');
%线性亮度增加
Fa = 0.5; Fb = 50;
O = Fa.*i + Fb/255;
figure(1), subplot(223), imshow(O);
title('Fa = 0.5, Fb = 50, brightness control');
figure(2), subplot(223), [H,x]=imhist(O,64);
stem(x, (H/m/n), '.');
title('Fa = 0.5, Fb = 50, brightness control');
%反相显示
Fa = -1; Fb = 255;
O = Fa.*i + Fb/255;
figure(1), subplot(224), imshow(O);
title('Fa = -1, Fb = 255, reversal processing');
figure(2), subplot(224),[H,x]=imhist(O, 64);
stem(x, (H/m/n), '.');
title('Fa = -1, Fb = 255, reversal processing');

(2)对数变换:
增强低灰度,减弱高灰度值。

i = imread('theatre.jpg');


i = rgb2gray(i);
i = double(i);

out1 = log(1+i)/0.065;
out2 = log(1+i)/0.035;
out1(find(out1>255)) = 255;
out2(find(out2>255)) = 255;
out1 = uint8(out1);
out2 = uint8(out2);

(3)幂次变换:
次数小于1时,增强低灰度,减弱高灰度;次数大于1时增强高灰度,减弱低灰度。

i = rgb2gray(imread('theatre.jpg'));
i = double(i);
y1 = 255*(i/255).^2.5;
y2 = 255*(i/255).^0.4;
y1 = uint8(y1);
y2 = uint8(y2);

(4) 指数变换:
增强高灰度,减弱低灰度。

i = imread('theatre.jpg');
i = rgb2gray(i);
i = double(i);

y1 = 1.5.^(i*0.070)-1;
y2 = 1.5.^(i*0.050)-1;
y1(find(y1>255)) = 255;
y2(find(y2>255)) = 255;
y1 = uint8(y1);
y2 = uint8(y2);

(5)灰度拉伸:
有时图像灰度集中在某小块区域,需要改变图像对比度。

i = imread('theatre.jpg');
i = rgb2gray(i);
L = imadjust(i,[ ],[50/255;150/255]);
J = imadjust(L,[50/255;150/255 ],[20/255;230/255]);

(6)灰度均衡:
i = rgb2gray(imread('theatre.jpg'));
LC = imadjust(i,[ ],[50/255;150/255]);
HE1 = histeq(LC);%均衡函数

(7)直方图规定化:
实现局部的灰度均衡。

img = rgb2gray(imread('theatre.jpg'));
img_ref = rgb2gray(imread('rpic.jpg'));%参考图,按照这个的的直方图进行规定化
[hgram, x] = imhist(img_ref);
J = histeq(img, hgram);

posted @ 2019-06-16 23:23 Geeksongs 阅读(...) 评论(...) 编辑 收藏
2019-05-16 19:22:40 qq_44091004 阅读数 562

图像转灰

一幅完整的图像,是由红色、绿色、蓝色三个通道组成的。红色、绿色、蓝色三个通道的缩览图都是以灰度显示的。用不同的灰度色阶来表示“ 红,绿,蓝”在图像中的比重。通道中的纯白,代表了该色光在此处为最高亮度,亮度级别是255。
通道是整个Photoshop显示图像的基础。色彩的变动,实际上就是间接在对通道灰度图进行调整。通道是Photoshop处理图像的核心部分,所有的色彩调整工具都是围绕在这个核心周围使用的。
在计算机领域中,这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;灰度图像在黑色与白色之间还有许多级的颜色深度。但是,在数字图像领域之外,“黑白图像”也表示“灰度图像”,例如灰度的照片通常叫做“黑白照片”。在一些关于数字图像的文章中单色图像等同于灰度图像,在另外一些文章中又等同于黑白图像。
开发工具:eclipse、opencv.
准备工作:安装eclipse、下载opencv安装包,将其配置在eclipse中。
配置方法可参照官网:
图像转灰的方法是对图像像素值进行操作,将三通道三个像素各不相同的分量值赋值成相同的值,就实现了灰度变换。
灰度变换的方法有好几种:
1.浮点算法:Gray=R0.3+G0.59+B0.11
2.整数方法:Gray=(R
30+G59+B11)/100
3.移位方法:Gray =(R76+G151+B*28)>>8;
4.平均值法:Gray=(R+G+B)/3;
5.仅取绿色:Gray=G;
本文采用的是第四种方法,代码如下:

package com;
//转灰
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
public class ToGray {
	static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);};
	public ToGray() {
		Mat source = Imgcodecs.imread("E://image//111.jpg");//读图片
		Mat dst = toGray(source);//调用转灰方法将结果保存在dst中
		Imgcodecs.imwrite("E://image//toGray1.jpg", dst);//将dst中的图片存在指定位置显示
	}

	Mat toGray(Mat source) {
		Mat dst = new Mat(source.size(), source.type());//获取图片的大小和类型
		for(int j = 0;j < source.height();j++) {
			for(int i = 0;i < source.width();i++) {
				double[] tmp = source.get(j, i);//获取图片像素值,注意这里的tmp是数组,存放的是该点rgb各分量值
				for(int k = 0;k < tmp.length;k++) {
					tmp[k] = (tmp[0]+tmp[1]+tmp[2])/3;//转灰,取三通道像素值和的平均值
				}
				dst.put(j, i, tmp);//将每一点的tmp值覆盖原来该点的像素值
			}
		}
		return dst;

	}

	public static void main(String[] args) {
		new ToGray();
	}

}


source
dst

2019-06-18 16:42:06 u012308586 阅读数 16437

    灰度图像上每个像素的颜色值又称为灰度,指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0。所谓灰度值是指色彩的浓淡程度,灰度直方图是指一幅数字图像中,对应每一个灰度值统计出具有该灰度值的象素数。

  灰度就是没有色彩,RGB色彩分量全部相等。如果是一个二值灰度图象,它的象素值只能为0或1,我们说它的灰度级为2。用个例子来说明吧:一个256级灰度的图象,如果RGB三个量相同时,如:RGB(100,100,100)就代表灰度为100,RGB(50,50,50)代表灰度为50。

  现在大部分的彩色图像都是采用RGB颜色模式,处理图像的时候,要分别对RGB三种分量进行处理,实际上RGB并不能反映图像的形态特征,只是从光学的原理上进行颜色的调配。

  图像灰度化处理可以作为图像处理的预处理步骤,为之后的图像分割、图像识别和图像分析等上层操作做准备。


  图像灰度化处理有以下几种方式:

  1. 分量法

  将彩色图像中的三分量的亮度作为三个灰度图像的灰度值,可根据应用需要选取一种灰度图像。

                  

  2. 最大值法

  将彩色图像中的三分量亮度的最大值作为灰度图的灰度值。

  

  3. 平均值法

  将彩色图像中的三分量亮度求平均得到一个灰度值。

  

  4. 加权平均法

  根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。

  


  以上这四种处理方式需要根据实际情况,进行选择。

  我个人使用C#实现情况如下:

2016-04-20 19:08:51 keith_bb 阅读数 29687

首先明确几个概念

1,灰度:对于通常所谓的黑白图像,把黑色和白色之间按对数关系分为若干等级称为灰度。灰度分为256阶,用灰度表示的图像称作灰度图.在图像中用0~255表示,0是全黑,255是全白

2.对比度:对比度值一幅图像中敏感区域最亮的白和最暗的黑之间的不同亮度层级的测量,差异范围越大代表对比月大。好的对比率120:1就可以容易的显式生动、丰富的色彩,当对比率达到300:1时便可以支持各阶的颜色。


imadjust()函数

前面博文介绍过imadjust()函数是针对灰度图进行灰度变换的基本图像处理工具箱函数。特别注意的是imadjust()函数会截掉在其取值范围外的灰度值,gamma值大于1图像变暗输出,gamma值小于1输出图像变亮。


stretchlim()函数

基本语法:Low_High=stretchlim(f);其中f是输入图像.较为通用的语法是:Low_High=stretchlim(f,tol);其中tol是两元素向量[Low_frac high_frac],指定了图像低和高像素值饱和度的百分比。如果tol是标量,那么low_frac=tol,high_frac=1-low_frac;饱和度等于低像素和高像素的百分比。如果在参数中忽略tol那么饱和度水平为2%,tol默认值为[0.01 0.99].如果选择tol=0,那么Low_High=[min(f(:)) max(f(:))].

Low_High的值指定灰度图像f中所有像素值底部和顶部饱和度的1%,结果以向量[low_in high_in]的形式应用于imadjust函数如:

g=imadust(f,stretchlim(f),[]);

下面以提高一幅图片对比度为例,提高对比度最简单的方法是提高白色画面亮度

%提高图像对比度
%载入图像
srcImage=imread('boiler.bmp');
info=imfinfo('boiler.bmp');

subplot(1,3,1);
imshow(srcImage);
title('原图像');

image1=imadjust(srcImage,[ ],[ ],0.8);
subplot(1,3,2);
imshow(image1);
title('gamma值调整');

image2=imadjust(srcImage,stretchlim(srcImage),[],0.8);
subplot(1,3,3);
imshow(image2);
title('stretchlim');

运行结果如下:


对数及对比度扩展变换

对数变换的一项主要应用是压缩动态范围。当执行对数变换时通常期望得到的是将压缩值返回至显式的全域,对于8比特来说在MATLAB中最简易的方法是使用下面语句:

g=im2uint8(mat2gray(f));


使用mat2gray将值限定在[0,1]范围内,使用im2uint8将值限定在[0,255]范围内。把图像转换为uint8类。函数把输入灰度图的窄范围扩展到输出灰度图的宽范围,结果就是高对比度的一幅图片。