如何选取灰度变换函数
- 格式: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)经实际验证:该方案对黑白图片均衡化处理有较好的效果。