- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数字图像灰度锐化彩色缩放综合报告
数字图像处理课程实验报告
1.1灰度变换
算法理论说明:
在某些情况下,为了将图像灰度级整个范围或其中某一段扩展或压缩到另一灰度范围质内,称灰度的线性变换。
(1)当图像曝光不充分,使区间小于区间,即:、可选用这样的变换:
通过这种变换,使得图像灰度范围从扩展到,实际上使曝光不充分的图像中黑的更黑、白的更白,从而提高了图像灰度的对比度。
(2)若图像的绝大部分灰度集中在之间,则用这样的变换:
这种变换实际上失去了一部分图像的信息。
(3)在某些情况下,为不失去信息,可采用部分压缩,部分扩展的分段变换的方法,如下图所示。
分段线性变换和灰度的线性变换有点类似,都用到了灰度的线性变换。但不同之处在于分段线性变换不是完全的线性变换,而是分段进行线性变换。将图像灰度区间分成两段乃至多段,分别作线性变换称之为分段线性变换,如图,分段线性变换的优点是可以根据用户的需要,拉伸特征物体的灰度细节,相对抑制不感兴趣的灰度级。图中的(0,a),(a,b),(b,255)等变换区间边界能通过键盘随时做交换式输入,因此,分段线性变换是非常灵活的。它的灰度变换函数如图所示,函数表达式如下:
式中,(a,c)和(b,d)是图中两个转折点坐标。
该变换函数的运算结果是将原图在a和b之间的灰度拉伸到c和d之间。通过选择的拉伸某段灰度区间,能够更加灵活地控制图像灰度直方图的分布,以改善输出图像量。如果一幅图像灰度集中在较暗的区域而导致图像偏暗,可以用灰度拉伸功能来拉伸(斜率1)物体灰度区间以改善图像质量;同样如果图像灰度集中在较亮的区域而导致图像偏亮,也可以用灰度拉伸功能来压缩(斜率1)物体灰度区间以改善图像质量。
线性灰度变换函数f(x)是一个一维线性函数:Db=f(Da)=faDa+fb。式中fa为线性函数斜率,fb为线性函数在y轴的截距,Da表示输入图像的灰度,Db表示输出图像的灰度。当fa1时,输出图像的对比度将增大;当fa1时,输出图像的对比度将减小。当fa=1且fb≠0时,操作仅使所有像素的灰度值上移或下移。当fa0时,暗区域将变亮,亮区域将变暗。当fa=1,fb=0时,输入图像与输出图像相同。当fa=-1,fb=255时,输出图像的灰度正好反转。
代码说明:
void CdemoView::OnGraystretch()
{
CdemoDoc* pDoc = GetDocument();
// 输入对象
CImgProcess imgInput = pDoc-m_Image;
// 检查图像是灰度
if (imgInput.m_pBMIH-biBitCount!=8)
{
AfxMessageBox(不是?8-bpp灰度图像,无法处理!);
return;
}
// 输出的临时对象
CImgProcess imgOutput = imgInput;
// 分段线性变换
imgInput.GrayStretch(imgOutput,50,100,200, 150);
// 将结果返回给文档类
pDoc-m_Image = imgOutput;
pDoc-SetModifiedFlag(true);
pDoc-UpdateAllViews(NULL);
}
BOOL CImgProcess::GrayStretch(CImgProcess* pTo, BYTE x1, BYTE y1, BYTE x2, BYTE y2)
{
if (m_pBMIH-biBitCount!=8) return false;
if (x1 x2) return false;
BYTE gray = 0;
int target; μ
for (int i = 0; i m_pBMIH - biHeight; i++)
{
for (int j = 0; j m_pBMIH - biWidth; j++)
{
gray = GetGray(j, i);
if (gray = x1)
{
target = y1 * gray / x1;
}
else if (gray = x2)
{
target = (y2 - y1) * (gray - x1) / (x2 - x1) + y1;
}
else
{
target = (255 - y2) * (gray - x2) / (255 - x2) + y2;
}
if (target 0) target = 0;
if (target 255) target = 255;
pTo - SetPixel(j, i, RGB(target, tar
文档评论(0)