一、彩色图像转变为灰度图像
将彩色图像进行灰度处理的原理就是使每个像素的RGB分量值都是相等的,调整后的RGB分量值可以有原来的RGB分量值按约定的比例来计算,这里采用等分的比例才计算灰度值,公式:Gray(i,j)=1/3(R(i,j)+G(i,j)+B(i,j)),当然也可以调整RGB分量的比例如Gray(i,j)=0.11*R(i,j)+0.59*G(i,j)+0.3*B(i,j),求出Gray值后,分别赋给对应像素的RGB分量,就能转变成灰度图像。
public int[] toGray(int[] pix, int iw, int ih)
{
ColorModel cm = ColorModel.getRGBdefault();
int r, g, b, gray;
for(int i = 0; i < iw*ih; i++)
{
r = cm.getRed(pix[i]);
g = cm.getGreen(pix[i]);
b = cm.getBlue(pix[i]);
gray =(int)((r + g + b) / 3);
pix[i] = 255 << 24|gray << 16|gray << 8|gray;
}
return pix;
}
实验效果如下:
二、灰度阀值变换
灰度的阀值变换可以将一幅灰度图像转换成黑白二值图像。操作过程如下:先由用户指定一个阀值,如果图像中某像素的灰度值小于该阀值,则将该像素的灰度值设置为0,否则灰度值设置为255。灰度阀值变换的变换函数表达式如下:f(i,j) = 0 , 当 f(i,j)< T f(i,j)= 255, 当 f(x,j)>T; 其中T为指定的阀值。程序如下:
public int[] thresh(int[] pix, int iw, int ih, int th)
{
ColorModel cm = ColorModel.getRGBdefault();
int r, g, b, gray;
for(int i = 0; i < iw*ih; i++)
{
r = cm.getRed(pix[i]);
g = cm.getGreen(pix[i]);
b = cm.getBlue(pix[i]);
gray =(int)((r + g + b) / 3);
if(gray > th) gray = 255;
else gray = 0;
pix[i] = 255 << 24|gray << 16|gray << 8|gray;
}
return pix;
}
实验效果如下:
三、灰度线性变换
假设原图像像素的灰度值为D = f(x,y), (x,y)为图像坐标,处理后图像像素的灰度值为D’ = g(x,y),则灰度变换函数可以表示为:g(x,y) = T[f(x,y)] 。要求D和D’都在图像的灰度范围之内。灰度变换函数描述了输入灰度值和输出灰度值之间的转换关系。一旦灰度转换关系确定,则图像中每一点的运算关系就被完全确定下来。
灰度图像主要针对独立的像素点进行处理,由输入像素点的灰度值来决定相应的输出像素点的灰度值,通过改变原始图像数据所占据的灰度范围而使图像在视觉上得到改观,由于灰度变换没有利用像素点之间的相互关系,因而这种处理方法也叫点运算。
灰度变换法又分为线性变换和非线性变换,是根据他们采用的算法来定义的。典型的非线性变换有:
1.负相变换
负相变换也叫做反相变换,即对每一个像素值求反。对图像求反就是讲原图的灰度值反转,简单的说就是黑的变成白的,白的变成黑的。
对于灰度图像或彩色图像的每个通道,其算法为:g(x,y) = 255 - f(x,y)
2.二值化和阈值处理
二值化是分段线性的一个特例,一副图像包括目标、背景和噪声,怎样从多值的灰度图像中提取出目标?最常用的方法就是设定一个阈值θ,用θ将图像的数据分成两部分:大于θ的像素群和小于θ的像素群。例如,输入图像为f(x,y),输出图像为f'(x,y),则f'(x,y) = 255(f(x,y) >= θ); f'(x,y) = 0(f(x,y) <= θ),这就是图像二值化处理,它的目标就是利用一个阈值θ将图像f(x,y)分成目标和背景两个领域。
3.分段线性变换
分段线性变换也叫做灰度线性拉伸,常用的是分三段分线性变换。如下图:
图中对灰度区间[a,b]进行了扩展,而灰度区间[0, a]和[b, Mf]收到了压缩。通过细心调整折线拐点的位置及控制分段直线的斜率,可对任意灰度区间进行扩展和压缩。、
对于非线性灰度变化,只是算法实现和最终效果上有区别,与线性变换一样,都是为了改善图像的质量。下面附上线性变换g(x,y)=p*f(x,y)+q(其中f表示原来的像素灰度值,g表示变换之后的像素灰度值)的程序:public int[] linetrans(int[] pix, int iw, int ih, float p, int q)
{
ColorModel cm = ColorModel.getRGBdefault();
int r, g, b;
for(int i = 0; i < iw*ih; i++)
{
r = cm.getRed(pix[i]);
g = cm.getGreen(pix[i]);
b = cm.getBlue(pix[i]);
//增加图像亮度
r = (int)(p * r + q);
g = (int)(p * g + q);
b = (int)(p * b + q);
if(r >= 255) r = 255;
if(g >= 255) g = 255;
if(b >= 255) b = 255;
pix[i] = 255 << 24|r << 16|g << 8|b;
}
return pix;
}
实验效果如下:
四、伪彩色处理
伪彩色处理就是讲灰度图像的像素值经过变换计算出红,绿,蓝3种分量的数值,其实就是彩色图像转变灰度图像的逆过程,程序如下:
//伪彩色处理
public int[] falseColor(int[] pix, int iw, int ih, int p, int q)
{
ColorModel cm = ColorModel.getRGBdefault();
int r, g, b;
for(int j = 0; j < ih; j++)
{
for(int i = 0; i < iw; i++)
{
r = cm.getRed(pix[j*iw+i]);
g = cm.getGreen(pix[j*iw+i]);
b = cm.getBlue(pix[j*iw+i]);
//R变换
if (r < p) r = 0;
else if (r >= p && r < q) r = (int)((r - p) * 255 / (q - p));
else r = 255;
//G变换
if (g < p) g = (int)(g * 255 / p);
else if (g >= p && g < q) g = 255;
else g = (int)((255 - g) * 255 / (255 - q));
//B变换
if (b < p) b = 255;
else if (b >= p && b < q) b = (int)((q - b) * 255 / (q - p));
else b = 0;
pix[j*iw+i] = 255 << 24|r << 16|g << 8|b;
}
}
return pix;
}
实验效果如下:
五、图像的融合
前面的处理运算都是针对一幅图像而言的,图像融合就是将两幅图像的像素值按一定的比例定义的方法合成得到新的像素,公式:F(i,j)=p*f(i,j)+q*g(i,j);公式使用的是线性融合,还可以是其他方法函数,参看程序:
public int[] combine(int[] pix1,int[] pix2,int iw, int ih, float p1, float p2)
{
ColorModel cm = ColorModel.getRGBdefault();
int[] mpix = new int[iw * ih];
int r, g, b;
for(int i = 0; i < ih; i++)
{
for(int j = 0; j < iw; j++)
{
r = (int)(p1*cm.getRed(pix1[i*iw+j])+
p2*cm.getRed(pix2[i*iw+j]));
g = (int)(p1*cm.getGreen(pix1[i*iw+j])+
p2*cm.getGreen(pix2[i*iw+j]));
b = (int)(p1*cm.getBlue(pix1[i*iw+j])+
p2*cm.getBlue(pix2[i*iw+j]));
mpix[i*iw+j] = 255 << 24|r << 16|g << 8|b;
}
}
return mpix;
}
实验效果如下:
六、图像合成
不同于图像融合,图像合成是两幅图像“拼接”成的一幅图像,在局部区域的像素是完全属于同一幅图像的,也就是说合成后的图像的任意一个像素只属于原来一个图像,当需要显示背景的图像的像素时,就必须要将前景色去掉(透明度为0),效果如下:
将鲨鱼图片的原白色背景色去掉(透明度调为零)
- 大小: 35.8 KB
- 大小: 47 KB
- 大小: 40.3 KB
- 大小: 44.5 KB
- 大小: 51.7 KB
- 大小: 60 KB
分享到:
相关推荐
数字图像处理图像点运算和代数运算的实现方法(matlab) 图像点运算和代数运算是数字图像处理的基本操作,它们对图像进行处理和变换,以达到图像增强、去噪、图像识别等目的。在 MATLAB 中,可以使用各种函数和命令...
点运算在数字图像处理中是一项基础且重要的技术,主要用于改变图像中每个像素的值,而不会改变像素的位置或数量。这种运算通常应用于增强图像、噪声去除、对比度调整等场景。MATLAB作为一款强大的数学计算软件,是...
在图像处理领域,点运算是一种基础且重要的技术。在VC++环境下实现图像点运算的程序,可以帮助我们深入理解和应用这些算法。点运算主要是对图像中的每个像素进行独立操作,不考虑像素之间的关系,如亮度调整、对比度...
在数字图像处理领域,点运算是一种基础且重要的技术,它涉及到对图像中每个像素值的独立操作。在VC++环境中实现这些运算可以帮助我们深入理解图像处理的原理,并为更复杂的图像算法打下基础。本资源提供了几个关键的...
图像点运算方法最终的成果形式是一个处于操作系统中间层的库,部分替代系统原本的OSD库,这个图像点运算方法里包含了最基础的简单图形算法和需要用到的数学函数,以及打包出来的用以实现绘制效果的图形效果函数库。...
"C#图像点运算和直方图"这一主题涵盖了两个关键概念:点运算和直方图处理。下面将详细介绍这两个知识点。 首先,让我们理解点运算。点运算是指对图像中的每个像素进行独立操作的过程。在C#中,这通常涉及到遍历图像...
【数字图像处理】中的点运算是一种基本的图像处理技术,主要目标是调整图像的灰度分布,通过特定的灰度变换函数(Grap Scale Transformation,GST)将输入图像的像素值转换为输出图像的像素值,形成一个新的图像。点...
基本图像处理,图像点运算,几何变换,灰度变换,对数变换
### 图像点运算处理知识点详解 #### 一、图像点运算概述 图像点运算是指在图像处理过程中,对图像中的每一个像素点进行独立处理的一种方法。这种处理方式不涉及像素之间的相互作用,因此计算简单高效,适用于各种...
Visual C++ 数字图像处理典型算法及实现包含图像显示、图像抓取、点运算、几何变换、正交变换、图像增强、形态学变换、边缘与轮廓处理、图像恢复等式一系列的操作。该源码是基于MFC的Visual C++开发,对于学习数字...
1. 点运算:点运算是一种基本的图像处理操作,它涉及到图像中的每个像素。在MFC中,可以通过遍历图像的每一个像素并对其进行操作来实现点运算。例如,可以对像素的RGB值进行加减乘除,或者进行非线性变换,如对数、...
在数字图像处理领域,"图像的点运算"是基础且重要的技术之一,它涉及到像素级别的操作。本资源是关于“VC++数字图像处理开发入门与编程实践”的第九章,主要探讨了如何使用C++进行图像的点运算,包括灰度直方图和...
matlab图像处理实验-图像增强的点运算及局部运算 资源内容包含代码、代码所需图片文件、实验报告分析(包括一 实验任务及目的中的内容) 一 实验任务及目的 1. 掌握图像增强的点运算常用方法的原理及实现; 2. 掌握...
在图像处理领域,点运算是一种基础且重要的操作,它针对图像中的每个像素进行独立处理,不涉及像素间的相互关系。《精通Visual C++数字图像处理典型算法及实现》第二版第三章深入探讨了这一主题,提供了丰富的源代码...
通过MFC单文档视图实现显示BMP图片点运算处理,包括图像灰度线性变换、灰度非线性变换、图像阈值化处理、图像均衡化处理等知识,并结合前一篇论文灰度直方图进行展示 。其中代码中含有详细注释。免费资源,希望能...
图像的像素运算主要涉及点运算、代数运算和逻辑运算。点运算是一种对比度增强技术,通过改变图像中每个像素点的灰度值来调整图像的整体视觉效果。点运算可以是线性的,例如简单的灰度值增益或偏移;也可以是非线性的...
【图像运算实验报告】 在医学图像处理领域,图像运算扮演着至关重要的角色,尤其是在数据分析和诊断过程中。MATLAB作为一个强大的计算平台,其图像处理工具箱提供了丰富的图像运算函数,使得图像处理变得更加便捷。...
实验目的:掌握MATLAB图像处理工具箱中的图像运算,包括点运算、代数运算、几何和邻域操作,以理解和应用这些基本运算来改变图像的特性。 硬件配置: - 处理器:Intel(R) Core(TM) i7-3770 CPU @3.40GHz 3.40GHz ...
在数字图像处理中,点运算是一种基本且重要的图像处理技术,主要用于改变图像的局部特性,如对比度和亮度。这种运算针对图像中的每个像素进行,因此得名“点运算”。在本课程设计中,学生需要掌握一门计算机语言,如...
这样,开运算能够有效地消除孤立的小白点和小黑核,同时保持大物体的连通性。对于具有细小分支或者尖锐突起的物体,开运算可以平滑其边缘,使得物体的边界更加清晰。 闭运算(Closing)则是先膨胀后腐蚀的过程。它...