如何选取灰度变换函数
- 格式:ppt
- 大小:816.00 KB
- 文档页数:43
Python图像运算之图像灰度线性变换详解⽬录⼀.灰度线性变换⼆.图像灰度上移变换三.图像对⽐度增强变换四.图像对⽐度减弱变换五.图像灰度反⾊变换六.总结⼀.灰度线性变换图像的灰度线性变换是通过建⽴灰度映射来调整原始图像的灰度,从⽽改善图像的质量,凸显图像的细节,提⾼图像的对⽐度。
灰度线性变换的计算公式如(12-1)所⽰:该公式中DB表⽰灰度线性变换后的灰度值,DA表⽰变换前输⼊图像的灰度值,α和b为线性变换⽅程f(D)的参数,分别表⽰斜率和截距[1-4]。
当α=1,b=0时,保持原始图像当α=1,b!=0时,图像所有的灰度值上移或下移当α=-1,b=255时,原始图像的灰度值反转当α>1时,输出图像的对⽐度增强当0<α<1时,输出图像的对⽐度减⼩当α<0时,原始图像暗区域变亮,亮区域变暗,图像求补如图12-1所⽰,显⽰了图像的灰度线性变换对应的效果图。
⼆.图像灰度上移变换该算法将实现图像灰度值的上移,从⽽提升图像的亮度。
DB=DA+50具体实现代码如下所⽰。
由于图像的灰度值位于0⾄255区间之内,所以需要对灰度值进⾏溢出判断。
# -*- coding: utf-8 -*-# By:Eastmountimport cv2import numpy as npimport matplotlib.pyplot as plt#读取原始图像img = cv2.imread('luo.png')#图像灰度转换grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#获取图像⾼度和宽度height = grayImage.shape[0]width = grayImage.shape[1]#创建⼀幅图像result = np.zeros((height, width), np.uint8)#图像灰度上移变换 DB=DA+50for i in range(height):for j in range(width):if (int(grayImage[i,j]+50) > 255):gray = 255else:gray = int(grayImage[i,j]+50)result[i,j] = np.uint8(gray)#显⽰图像cv2.imshow("Gray Image", grayImage)cv2.imshow("Result", result)#等待显⽰cv2.waitKey(0)cv2.destroyAllWindows()其输出结果如图12-2所⽰,图像的所有灰度值上移50,图像变得更⽩了。
matlab 灰度算法-回复【MATLAB灰度算法】灰度算法是一种将彩色图像转化为黑白图像的方法,在计算机视觉和图像处理领域被广泛使用。
MATLAB是一种强大的数学计算工具,它提供了丰富的图像处理函数和工具箱,可用于实现灰度算法。
本文将逐步回答如何使用MATLAB实现灰度算法,并介绍一些常用的灰度算法技术。
# 第一步:图像读取与显示在MATLAB中,可以使用`imread`函数读取图像,使用`imshow`函数显示图像。
我们首先需要读取一张彩色图像,并将其显示出来。
matlab读取彩色图像rgbImage = imread('image.jpg');显示彩色图像imshow(rgbImage);title('Original Image');# 第二步:转化为灰度图像灰度图像是一种每个像素只有一个灰度值(亮度值)的图像。
在MATLAB中,可以使用`rgb2gray`函数将彩色图像转化为灰度图像。
matlab将彩色图像转化为灰度图像grayImage = rgb2gray(rgbImage);显示灰度图像imshow(grayImage);title('Grayscale Image');# 第三步:灰度化算法选择灰度化算法决定了如何将彩色图像中的RGB信息转化为灰度图像中的灰度值。
常用的灰度化算法有平均值法、加权平均法和分量最大法等。
下面分别介绍这些算法并给出MATLAB代码实现。
平均值法平均值法是最简单的灰度化算法之一,它将彩色图像的RGB分量的平均值作为灰度值。
具体实现如下:matlab平均值法灰度化averageGrayImage = (rgbImage(:, :, 1) + rgbImage(:, :, 2) + rgbImage(:, :, 3)) / 3;显示平均值法灰度图像imshow(averageGrayImage);title('Average Grayscale Image');加权平均法加权平均法是一种考虑了RGB分量的亮度影响的灰度化算法。
灰度变换函数灰度变换函数是一种常见的图像处理方法,通过对图像的像素值进行线性变换,可以实现图像的亮度调整和对比度增强等效果。
下面是一个全面详细的灰度变换函数。
```pythondef gray_transform(img, a, b, c, d):"""灰度变换函数:param img: 输入图像,格式为numpy数组:param a: 线性变换的斜率,浮点数:param b: 线性变换的截距,浮点数:param c: 灰度级范围的下限,整数:param d: 灰度级范围的上限,整数:return: 输出图像,格式为numpy数组"""# 判断输入参数是否合法if not isinstance(img, np.ndarray) or len(img.shape) != 2:raise ValueError("输入图像必须是二维numpy数组")if not isinstance(a, float) or not isinstance(b, float):raise ValueError("线性变换参数必须是浮点数")if not isinstance(c, int) or not isinstance(d, int):raise ValueError("灰度级范围必须是整数")if c < 0 or d > 255:raise ValueError("灰度级范围必须在0-255之间")# 对输入图像进行线性变换,并将结果转化为整型数据类型out_img = np.round(a * img + b).astype(np.uint8)# 对输出图像进行灰度级范围限制,将超出范围的像素值裁剪到范围内out_img = np.clip(out_img, c, d)return out_img```上面的函数中,我们使用了numpy库来处理图像数据。
各灰度级的变换函数值sk公式在数字图像处理中,图像的灰度级是指像素点的亮度强度的级别,通常以0-255的数字表示。
图像灰度级的变换函数值sk是指将原始图像中的一个灰度级映射到另一个灰度级时,所需要的函数值。
灰度级变换是数字图像处理中常用的操作之一,其主要作用是改变图像的亮度、对比度、色彩等特征,从而使图像更加清晰、鲜艳、易于识别和处理。
不同的图像灰度级变换函数可以产生不同的效果,因此在实际应用中需要根据具体的需求选择适当的函数。
下面我们将详细介绍各灰度级的变换函数值sk公式,以及它们的作用和应用场景:1. 线性变换函数线性变换函数是最常用的一种灰度级变换函数,其公式为:s_k = [(L-1)/(H-L)]*(r_k-L)其中,L和H分别表示原始图像灰度级的最小值和最大值,r_k表示原始图像的像素值,s_k表示变换后的像素值。
线性变换函数的作用是增加或减小图像的对比度,使图像更加清晰、鲜明。
它常用于图像增强、亮度调整和对比度调整等操作中。
2. 对数变换函数对数变换函数的公式为:s_k = c * log(1+r_k)其中,c为常数,r_k和s_k的含义同上。
对数变换函数的主要作用是扩展暗部细节,减少高光区域的亮度,从而达到良好的曝光平衡。
它常用于夜间拍摄或者对内部细节有特殊需求的图像处理中。
3. 幂律变换函数幂律变换函数的公式为:s_k = c * r_k^γ其中,c为常数,γ为幂律指数,r_k和s_k的含义同上。
幂律变换函数的主要作用是突出图像细节、增加图像对比度和色彩饱和度,使图像更加明亮鲜艳。
它适用于各种类型的图像处理,尤其是自然景观、建筑和人像等领域。
4. 反转变换函数反转变换函数的公式为:s_k = L-1-r_k其中,L为原始图像的灰度级最大值,r_k和s_k的含义同上。
反转变换函数的作用是颠倒图像亮度的分布,使原来的暗区变为明区,明区变为暗区,从而产生强烈的视觉反差。
它常用于黑白摄影、动画和游戏制作等领域。
灰度反转函数灰度反转函数介绍灰度反转是一种图像处理方法,它将图像中的亮度值取反,使得原来较暗的区域变为较亮的区域,原来较亮的区域变为较暗的区域。
这种处理方法通常用于增强图像的对比度和清晰度。
实现思路灰度反转函数可以通过以下步骤实现:1.读取图像文件并将其转换为灰度图像。
2.对每个像素点进行灰度值反转计算。
3.将计算后的结果保存为新的图像文件。
代码实现下面是一个Python实现灰度反转函数的示例代码:```pythonimport cv2def invert_grayscale(image_path, output_path):# 读取图像文件并将其转换为灰度图像image = cv2.imread(image_path)gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 对每个像素点进行灰度值反转计算inverted_image = 255 - gray_image# 将计算后的结果保存为新的图像文件cv2.imwrite(output_path, inverted_image)```使用示例下面是一个使用示例:```pythonimage_path = 'example.jpg'output_path = 'inverted_example.jpg'invert_grayscale(image_path, output_path)```注意事项在使用该函数时,需要注意以下几点:1.输入和输出的图像文件路径必须存在。
2.输入图像文件必须是彩色图像,否则需要先将其转换为灰度图像。
3.输出图像文件的格式可以是任何OpenCV支持的格式,例如JPEG、PNG等。
4.该函数只能对灰度值进行反转,如果需要对颜色进行反转,则需要使用其他方法。
总结灰度反转函数是一种简单但有效的图像处理方法,它可以增强图像的对比度和清晰度。
图像的线性灰度变换线性灰度变换的两种方法:(1)全图变换(2)两端截取的分段变换(1)全图变换变换公式为g(x)=f(x)*c+R其中f(x)为图像的输入灰度,g(x)为图像的输出灰度若设输入图像的灰度范围为(fmin,fmax),输出的灰度范围为(gmin,gmax)则变换公式为g(x)=(gmax-gmin)/(fmax-fmin)*(f(x)-fmin)+gmin一般来说为灰度拉伸,即gmin<fmin,gmax>fmax,对于一副一般的正常灰度图像fmin=0,fmax=255。
以下为实现代码:void CDipView::OnGraystrectch(){CDipDoc*pDoc=GetDocument();if(!(pDoc->m_pBmi&&pDoc->m_pBmData)){MessageBox(_T("No Object"),MB_OK);}else{int flag=0;//是否灰度图标记int i_top=pDoc->m_pBmi->bmiHeader.biHeight;int j_top=pDoc->m_pBmi->bmiHeader.biWidth*3;int w=pDoc->m_pBmi->bmiHeader.biSizeImage/i_top;double gmin=pDoc->m_pBmData[0],gmax=pDoc->m_pBmData[0];for(int i=0;i<i_top;i++){for(int j=0;j<j_top;j+=3){if(!((pDoc->m_pBmData[i*w+j]==pDoc->m_pBmData[i*w+j+1])&&(pDoc->m_pBmData[i*w+j+1]==pDoc->m_pBmData[i*w+j +2]))){flag=1;break;}}if(flag){break;}}//判断是否灰度图if(flag){MessageBox(_T("不是灰度图"),MB_OK);m_type=0;}else{for(int i=0;i<i_top;i++){for(int j=0;j<j_top;j+=3){gmin=min(gmin,pDoc->m_pBmData[i*w+j]);gmax=max(gmax,pDoc->m_pBmData[i*w+j]);}}for(int i=0;i<i_top;i++){for(int j=0;j<j_top;j+=3){pDoc->m_pBmData[i*w+j]=(byte)(255.0/(gmax-gmin)*(pDoc->m_pBmData[i*w+j]-gmin));pDoc->m_pBmData[i*w+j+1]=(byte)(255.0/(gmax-gmin)*(pDoc->m_pBmData[i*w+j+1]-gmin));pDoc->m_pBmData[i*w+j+2]=(byte)(255.0/(gmax-gmin)*(pDoc->m_pBmData[i*w+j+2]-gmin));}}Invalidate();}}// TODO: 在此添加命令处理程序代码}直方图的变化(2)两端截取的灰度拉伸很多时候图片的大部分像素的灰度级在(fmin,fmax)内分布,少部分分布在小于fmin和大于fmax的区间内,此时用下式进行变换:g(x)=gmin f(x)<fming(x)= (gmax-gmin)/(fmax-fmin)*(f(x)-fmin)+gmin fmin<=f(x)<=fmaxg(x)=gmax f(x)>fmax缺点:会造成小部分信息的丢失具体实现代码如下:void CDipView::OnAutostrecth(){CDipDoc*pDoc=GetDocument();if(!(pDoc->m_pBmi&&pDoc->m_pBmData)){MessageBox(_T("No Object"),MB_OK);}else{int flag=0;//是否灰度图标记int i_top=pDoc->m_pBmi->bmiHeader.biHeight;int j_top=pDoc->m_pBmi->bmiHeader.biWidth*3;int w=pDoc->m_pBmi->bmiHeader.biSizeImage/i_top;double gmin,gmax;for(int i=0;i<i_top;i++){for(int j=0;j<j_top;j+=3){if(!((pDoc->m_pBmData[i*w+j]==pDoc->m_pBmData[i*w+j+1])&&(pDoc->m_pBmData[i*w+j+1]==pDoc->m_pBmData[i*w+j +2]))){flag=1;break;}}if(flag)break;}//判断是否灰度图if(flag){MessageBox(_T("不是灰度图"),MB_OK);m_type=0;}else{long y[256];///全赋初值为零///for(int i=0;i<256;i++){y[i]=0;}////灰度分布统计////for(int i=0;i<i_top;i++){for(int j=0;j<j_top;j+=3){y[(pDoc->m_pBmData[i*w+j])]++;}}for(int i=0;i<256;i++){if(y[i]>300){gmin=i;break;}}for(int i=255;i>=0;i--){if(y[i]>300){gmax=i;break;}}for(int i=0;i<i_top;i++){for(int j=0;j<j_top;j+=3){if(pDoc->m_pBmData[i*w+j]<=gmin){pDoc->m_pBmData[i*w+j]=gmin;pDoc->m_pBmData[i*w+j+1]=gmin;pDoc->m_pBmData[i*w+j+2]=gmin;}if(pDoc->m_pBmData[i*w+j]>=gmax){pDoc->m_pBmData[i*w+j]=gmax;pDoc->m_pBmData[i*w+j+1]=gmax;pDoc->m_pBmData[i*w+j+2]=gmax;}pDoc->m_pBmData[i*w+j]=(byte)min(255,(255.0/(gmax-gmin)*(pDoc->m_pBmData[i*w+j]-gmin)));pDoc->m_pBmData[i*w+j+1]=(byte)min(255,(255.0/(gmax-gmin)*(pDoc->m_pBmData[i*w+j+1]-gmin)));pDoc->m_pBmData[i*w+j+2]=(byte)min(255,(255.0/(gmax-gmin)*(pDoc->m_pBmData[i*w+j+2]-gmin)));}}Invalidate();}}}直方图变化。
灰度变换算法原理
灰度变换算法是一种像素值映射的算法,它可以通过对图像的像素值进行线性或非线性变换来改变图像的对比度、亮度、色调等特征,以达到增强图像的目的。
具体来说,灰度变换算法的原理如下:
1. 像素值的定义:对于灰度图像,每个像素的取值范围在0-255之间,其中0表示黑色,255表示白色,其他值则表示不同的灰度级别。
2. 灰度变换函数的选择:灰度变换函数(也称为灰度映射函数)可以是线性函数、非线性函数、对数函数等。
根据需要调整图像的对比度、亮度等特征,可以选择不同的灰度变换函数。
3. 灰度变换的实现:将灰度变换函数应用到图像的每个像素上,计算出新的像素值,从而得到一张新的图像。
这样的变换可以在空间域或频域中进行。
总之,灰度变换算法通过对图像的像素值进行变换,可以有效地增强图像的质量和特征,提高图像信息的可读性和可用性。
opencv转换灰度算法OpenCV 是一个功能强大的计算机视觉库,它可以通过各种算法来处理图像和视频。
其中最基本的算法就是灰度转换。
灰度转换是将一幅彩色图像转换为灰度图像的过程,其目的是使图像更加简单,并且可以减少计算量。
下面我们来了解一下 OpenCV 中的灰度转换算法。
OpenCV 中的灰度转换算法主要有两种:平均值法和加权平均值法。
平均值法是将原图中每个像素的 RGB 值取平均值,然后得到一幅灰度图像。
而加权平均值法则是将红、绿、蓝三种颜色的权值乘以对应像素点的值,再相加得到一个灰度值。
平均值法实现灰度转换的代码如下:```pythonimport cv2# 读取一张彩色图像img = cv2.imread('image.png')# 平均值法转换为灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 显示灰度图像cv2.imshow('gray', gray)cv2.waitKey(0)```在加权平均值法中,我们可以自定义颜色的权值,以达到不同的灰度效果。
下面是加权平均值法实现灰度转换的代码:```pythonimport cv2# 读取一张彩色图像img = cv2.imread('image.png')# 定义颜色的权值b = 0.114g = 0.587r = 0.299# 加权平均值法转换为灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)rows, cols = gray.shapefor i in range(rows):for j in range(cols):gray[i, j] = b * img[i, j, 0] + g * img[i, j, 1] + r * img[i, j, 2]# 显示灰度图像cv2.imshow('gray', gray)cv2.waitKey(0)```从效果来看,加权平均值法比平均值法更加逼真,但是计算量较大。
灰度图像直方图均衡化变换函数算法方案一:1) 灰度图像直方图均衡化算法步骤:1、列出原始图像和变换后图像的灰度级I: j = 0, 1, -L-1,其中L是灰度级的个数;2、统计原始图像个灰度级的像素个数Ni;3、计算原始图像直方图:p(i)=Ni/N,N为原始图像像素总数;4、计算累计直方图P j =》p(k), k二0, l・・・j;5、利用灰度变换函数计算变换后的灰度值,并四舍五入:j=INT[(L-l)Pj+0. 5];6、确定灰度变换关系i->j,据此将原图像的灰度值f(m, n) = i修正为g(m, n)=j;7、统计变换后各灰度级的像素个数Nj;8、计算变换后图像的直方图p(j)二Nj/N;2) m文件I=imread('football.jpg 1 );1=1(:, :,1);[m z n]=size (I);num=m*n;pre_mat=zeros(1,256);aft_mat=zeros(1,256);for i=l:mfor j=l:npre_mat(I(i z j)+1)= pre_mat(I(i z j)+1)+1;endendaft_mat (I) =aft_mat (I) /num;for k=2:256s (k) =pre_mat (k) /num;aft_mat (k) =aft_mat (k-l) + s (k);endM=zeros(叫n);aft_mat=aft_mat*255;for i=l:mfor j=l:nM(i z j)=aft_mat(I (i,j)+1);endendJ=uint8(M)subplot (3,2f l)imshow(I);1.原始图像T;subplot (3,2,2) imhist(I);title(*2.原始图像直方图'); subplot(3,2^3) imshow(J);title (! 3.均衡化图像'); subplot (3,2,4) imhist(J);title 「4 •均衡化图像直方图*);A=histeq(I); subplot(3,2^5) imshow(A);title(*5.系统均衡化图像T ; subplot (3,2,6) imhist(A);title 「6・系统均衡化图像直方图1)经实际验证:该方案对黑白图片均衡化处理有较好的效果。
图像灰度变换、⼆值化、直⽅图1、灰度变换1)灰度图的线性变换Gnew = Fa * Gold + Fb。
Fa为斜线的斜率,Fb为y轴上的截距。
Fa>1 输出图像的对⽐度变⼤,否则变⼩。
Fa=1 Fb≠0时,图像的灰度上移或下移,效果为图像变亮或变暗。
Fa=-1,Fb=255时,发⽣图像反转。
注意:线性变换会出现亮度饱和⽽丢失细节。
2)对数变换t=c * log(1+s)c为变换尺度,s为源灰度,t为变换后的灰度。
对数变换⾃变量低时曲线斜率⾼,⾃变量⼤时斜率⼩。
所以会放⼤图像较暗的部分,压缩较亮的部分。
3)伽马变换y=(x+esp)γ,x与y的范围是[0,1], esp为补偿系数,γ为伽马系数。
当伽马系数⼤于1时,图像⾼灰度区域得到增强。
当伽马系数⼩于1时,图像低灰度区域得到增强。
当伽马系数等于1时,图像线性变换。
4)图像取反⽅法1:直接取反imgPath = 'E:\opencv_pic\src_pic\pic2.bmp';img1 = imread(imgPath); % 前景图img0 = 255-img1; % 取反景图subplot(1,2,1),imshow(img1),title('原始图像');subplot(1,2,2),imshow(img0),title('取反图像');⽅法2:伽马变换Matlab:imadjust(f, [low_in, high_in], [low_out, high_out], gamma)[low_in, high_in]范围内的数据映射到 [low_out, high_out],低于low的映射到low_out, ⾼于high的映射到high_out. imgPath = 'E:\opencv_pic\src_pic\pic2.bmp';img1 = imread(imgPath); % 前景图img0 = imadjust(img1, [0,1], [1,0]);subplot(1,2,1),imshow(img1),title('原始图像');subplot(1,2,2),imshow(img0),title('取反图像');2、⼆值化1)rgb2gray⼀般保存的灰度图是24位的灰度,如果改为8bit灰度图。
灰度变换的实现原理及应用1. 灰度变换的概述灰度变换是一种图像处理技术,用于改变图像的亮度和对比度。
通过对图像中的每个像素进行数学变换,可以改变像素的亮度级别,并使得整个图像的灰度分布发生变化。
灰度变换通常用于增强图像的细节,调整图像的亮度和对比度,以及实现特定的视觉效果。
2. 灰度变换的实现原理灰度变换的实现原理基于对图像的像素进行数学运算。
常见的灰度变换公式如下:•线性变换:$g(x, y) = \\alpha * f(x, y) + \\beta$,其中f(x,y)表示原始图像的灰度值,g(x,y)表示变换后的灰度值,$\\alpha$ 和 $\\beta$ 是常数。
•幂律变换:$g(x, y) = c * f(x, y)^{\\gamma}$,其中c和$\\gamma$ 是常数,f(x,y)表示原始图像的灰度值,g(x,y)表示变换后的灰度值。
•对数变换:$g(x, y) = c * \\log(1 + f(x, y))$,其中c是常数,f(x,y)表示原始图像的灰度值,g(x,y)表示变换后的灰度值。
灰度变换的核心思想是通过对原始图像的灰度值进行数学运算,改变图像的亮度和对比度。
不同的变换公式可以实现不同的效果,例如加强图像的亮度和对比度、调整图像的色调和饱和度等。
3. 灰度变换的应用灰度变换在图像处理中有广泛的应用,包括但不限于以下方面:3.1 图像增强灰度变换可以用于增强图像的细节和对比度,改善图像的视觉效果。
通过合理地选择灰度变换的参数,可以使得图像中的细节更加清晰,色彩更加丰富。
3.2 图像去噪灰度变换可以用于图像去噪。
通过对图像的灰度值进行变换,可以减小图像中的噪声,并改善图像的质量。
常见的去噪方法包括中值滤波、均值滤波等。
3.3 图像分割灰度变换可以用于图像分割。
通过对图像的灰度值进行变换,可以将图像中的不同区域分割出来,方便进行进一步的分析和处理。
3.4 图像匹配灰度变换可以用于图像匹配。
【数字图像处理】灰度变换原⽂链接:作者:图像的空间域滤波,其对像素的处理都是基于像素的某⼀邻域进⾏的。
本⽂介绍的图像的灰度变换则不同,其对像素的计算仅仅依赖于当前像素和灰度变换函数。
灰度变换也被称为图像的点运算(只针对图像的某⼀像素点)是所有图像处理技术中最简单的技术,其变换形式如下:s=T(r)s=T(r)其中,T是灰度变换函数;r是变换前的灰度;s是变换后的像素。
图像灰度变换的有以下作⽤:改善图像的质量,使图像能够显⽰更多的细节,提⾼图像的对⽐度(对⽐度拉伸)有选择的突出图像感兴趣的特征或者抑制图像中不需要的特征可以有效的改变图像的直⽅图分布,使像素的分布更为均匀常见的灰度变换灰度变换函数描述了输⼊灰度值和输出灰度值之间变换关系,⼀旦灰度变换函数确定下来了,那么其输出的灰度值也就确定了。
可见灰度变换函数的性质就决定了灰度变换所能达到的效果。
⽤于图像灰度变换的函数主要有以下三种:线性函数(图像反转)对数函数:对数和反对数变换幂律函数:n次幂和n次开⽅变换上图给出了⼏种常见灰度变换函数的曲线图,根据这⼏种常见函数的曲线形状,可以知道这⼏种变换的所能达到的效果。
例如,对数变换和幂律变换都能实现图像灰度级的扩展/压缩,另外对数变换还有⼀个重要的性质,它能压缩图像灰度值变换较⼤的图像的动态范围(例如,傅⽴叶变换的频谱显⽰)。
线性变换令r为变换前的灰度,s为变换后的灰度,则线性变换的函数:s=a⋅r+bs=a⋅r+b其中,a为直线的斜率,b为在y轴的截距。
选择不同的a,b值会有不同的效果:a>1a>1,增加图像的对⽐度a<1a<1,减⼩图像的对⽐度a=1且b≠0a=1且b≠0,图像整体的灰度值上移或者下移,也就是图像整体变亮或者变暗,不会改变图像的对⽐度。
a<0且b=0a<0且b=0,图像的亮区域变暗,暗区域变亮a=1且b=0a=1且b=0,恒定变换,不变a=−1且b=255a=−1且b=255,图像反转。
数字图像处理-空间域处理-灰度变换-基本灰度变换函数(反转变换、对数变换、伽马变换和分段线性变换)总结性的⼀篇博⽂,内容其实很简单,之所以写出来是为了对⾃⼰之前所学做⼀些总结。
参考⾃:《数字图像处理》--第三版--冈萨勒斯--中,以及师兄提供的参考资料,在此对师兄表⽰感谢。
空间域处理是直接对像素进⾏操作的⽅法,这是相对于频率域处理⽽⾔的。
空间域处理主要分为两⼤类:灰度变换和空间滤波。
灰度变换在图像单个像素上操作,主要以对⽐度和阈值处理为⽬的。
空间滤波涉及改善性能的操作,通过像元领域来处理。
空间域处理均可由下式表达:表⽰f(x, y)输⼊图像,g(x,y)表⽰输出图像,T 是变换算⼦(数学规则)灰度变换可以看作领域⼤⼩为1*1的空间域处理,这这种情况下上式变为灰度变换函数:r和s分别为输⼊、输出灰度基本的灰度变换函数常⽤的基本函数有三类:线性函数,对数函数(对数和反对数)和幂律函数(n次幂和n次根)图像反转适⽤于增强嵌⼊在⼀幅图像暗区域中的⽩⾊或灰⾊细节。
变换公式为:图像灰度级范围为[0,L-1]"""反转变换"""import numpy as npimport cv2import matplotlib.pyplot as pltdef reverse(img):output = 255 - imgreturn outputimg1 = cv2.imread(r'F:\program_study\Python\data\breast.tif') # 前头加r是消除反斜杠转义cv2.imshow('input', img1)x = np.arange(0, 256, 0.01)y = 255 - xplt.plot(x, y, 'r', linewidth=1)plt.title('反转变换函数图')plt.xlim([0, 255]), plt.ylim([0, 255])plt.show()img_output = reverse(img1)dWindow('output', cv2.WINDOW_NORMAL) # 可改变窗⼝⼤⼩cv2.imshow('output', img_output)cv2.waitKey(0)cv2.destroyAllWindows()反转变换对数变换对数变换可以拉伸范围较窄的低灰度值,同时压缩范围较宽的⾼灰度值。
图像处理之图像的灰度变换
前面几篇文章介绍的是图像的空间域滤波,其对像素的处理都是基于像素的某一邻域进行的。
本文介绍的图像的灰度变换则不同,其对像素的计算仅仅依赖于当前像素和灰度变换函数。
灰度变换也被称为图像的点运算(只针对图像的某一像素点)是所有图像处理技术中最简单的技术,其变换形式如下:s = T ( r )其中,T 是灰度变换函数;r 是变换前的灰度;s 是变换后的像素。
图像灰度变换的有以下作用:•改善图像的质量,使图像能够显示更多的细节,提高图像的对比度(对比度拉伸)•有选择的突出图像感兴趣的特征或者抑制图像中不需要的特征•可以有效的改变图像的直方图分布,使像素的分布更为均匀
常见的灰度变换
灰度变换函数描述了输入灰度值和输出灰度值之间变换关系,一旦灰度变换函数确定下来了,那么其输出的灰度值也就确定了。
可见灰度变换函数的性质就决定了灰度变换所能达到的效果。
用于图像灰度变换的函数主要有以下三种:•线性函数(图像反转)•对数函数:对数和反对数变换•幂律函数:n次幂和n次开方变换
上图给出了几种常见灰度变换函数的曲线图,根据这几种常见函数的曲线形状,可以知道这几种变换的所能达到的效果。
例如,对数变换和幂律变换都能实现图像灰度级的扩展/压缩,另外对数变换还有一个重要的性质,它能压缩图像灰度值变换较大的图像的动态范围(例如,傅立叶变换的频谱显示)。
线性变换
令r 为变换前的灰度,s为变换后的灰度,则线性变换的函数:s = a ⋅r + b其中,a 为直线的斜率,b 为在y 轴的截距。
选择不同的a,b 值会有不同的效果:• a > 1,增加图像的对比度• a。
c语⾔数字图像处理(四):灰度变换灰度变换灰度变换函数 s = T(r) 其中r为输⼊图像在(x, y)点处的灰度值,s为输出图像在(x, y)点处的灰度值灰度变换的作⽤上图所⽰的两幅T(s)函数的图像曲线,第⼀幅图可以增强图像对⽐度,第⼆幅图可以对图像进⾏⼆值化处理灰度变换函数反转函数1void reverse(short** in_array, short** out_array, long height, long width)2 {3for (int i = 0; i < height; i++){4for (int j = 0; j <width; j++)5 out_array[i][j] = GRAY_LEVELS - in_array[i][j];6 }7 }最简单的灰度变换函数,将图像中的每个像素点处的颜⾊值反转,对于8位灰度图⽚,⽤255减去原灰度值原图反转图对数变换s = clog(1 + r) c为常数,本次测试中c取101void logarithm(short** in_array, short** out_array, long height, long width) 2 {3for (int i = 0; i < height; i++){4for (int j = 0; j <width; j++)5 out_array[i][j] = (short)(10 * log((1 + in_array[i][j])));6 }7 }可以看出,对数变换降低了图像的对⽐度幂律(伽马)变换s = crγ其中 c 和γ为正常数其中γ<1时,降低对⽐度,γ>1时,提⾼对⽐度γ = 1.21void gamma(short** in_array, short** out_array, long height, long width)2 {3for (int i = 0; i < height; i++){4for (int j = 0; j <width; j++)5 out_array[i][j] = (short)pow(in_array[i][j], 1.2);6 }7 }直⽅图均衡化直⽅图为离散函数h(r k) = n k, 其中r k是第k级灰度值,n k是图像中h灰度为r k的像素个数现在给出上⾯⼏幅图像的直⽅图可以明显看出,对⽐度越⾼的图像,直⽅图的分布越均衡,因此直⽅图均衡化算法可以显著提⾼图像对⽐度直⽅图均衡化算法推导(需⼀定⾼等数学及概率论知识)算法实现1void calculate_histogram(long height, long width, short **image, unsigned long histogram[]) 2 {3short k;4for(int i=0; i < height; i++){5for(int j=0; j < width; j++){6 k = image[i][j];7 histogram[k] = histogram[k] + 1;8 }9 }10 }1112void histogram_equalization(short** in_array, short** out_array, long height, long width)13 {14 unsigned long sum, sum_of_h[GRAY_LEVELS];15double constant;16 unsigned long histogram[GRAY_LEVELS] = {};1718 calculate_histogram(height, width, in_array, histogram);19 sum = 0;20for(int i=0; i < GRAY_LEVELS; i++){21 sum = sum + histogram[i];22 sum_of_h[i] = sum;23 }2425 constant = (double)(GRAY_LEVELS)/(double)(height*width);26for(int i = 0, k = 0; i < height; i++){27for(int j = 0; j < width; j++){28 k = in_array[i][j];29 out_array[i][j] = sum_of_h[k] * constant;30 }31 }32 }。
灰度的线性变换功能:通过将图像中的所有的点的灰度按照线性灰度变换函数进⾏变换,最常见的线性变换就是反转。
算法:灰度的线性变换⽤到的线性灰度变换函数f(x)是⼀个⼀维线性函数:f(x) = kx + d,应⽤到图像上就带⼈各像素点的灰度值:Gd=f(Gs) = k*Gs + d;其中k为线性函数的斜率,d为线性函数在y轴的截距。
Gs表⽰输⼊图像的灰度,Gd表⽰输出图像的灰度。
当k>1时,输出图像的对⽐度将增⼤;当k<1时,输出图像的对⽐度将减⼩;当k=1且d≠0时,操作使所有的灰度值上移或下移,其效果是使整个图像变暗或变亮。
当k<0,暗区域将变亮,亮区域将变暗,点运算完成了图形求补运算。
特殊情况:1、当k=1,d=0时,输出图像与原图像相同。
2、当k=-1,d=255时,输出图像的灰度正好相反。
实现代码:for( int i=0; i<iPixelHeight; i++ ){for( int j=0; j<iPixelWidth; j++ ){//指向像素数据的第i⾏,第j列/个像素的指针lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight-1-i) + j; //lLineBytes * (lHeight-1-i) + j不懂fTemp = k*(*lpSrc) + d; //线性变换if( fTemp > 255 ){*lpSrc = 255;}else if ( fTemp<0 ){*lpSrc = 0}else{*lpSrc = (unsigned char)(fTemp+0.5); //四舍五⼊}}}所谓的饱和度,指的其实是⾊彩的纯度,纯度越⾼,表现越鲜明,纯度较低,表现则较黯淡,⾊饱和度表⽰光线的彩⾊深浅度或鲜艳度,取决于彩⾊中的⽩⾊光含量,⽩光含量越⾼,即彩⾊光含量就越低,⾊彩饱和度即越低,反之亦然。