c++和mfc图像处理课设

给自己的大二课设存个档
可以处理8位和256位图
#2.1.1反色
反色用到的算子[0 0 0 ,系数是-1.0
0 1 0
0 0 0 ]

反色的实际含义是将R、G、B值反转。若颜色的量化级别是256,则新图的R、G、B值为255减去原图的R、G、B值。而对于本次处理的灰度图像而言,直接用255减去像素原来的灰度值即可。

BOOL WINAPI ZDYLJ(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, long lLineBytes,
	int iTempH, int iTempW,
	int iTempMX, int iTempMY,
	FLOAT* fpArray, double fCoef, int fConst)
{
	// 指向复制图像的指针
	LPSTR	lpNewDIBBits;
	HLOCAL	hNewDIBBits;

	// 指向源图像的指针
	unsigned char* lpSrc;

	// 指向要复制区域的指针
	unsigned char* lpDst;

	// 循环变量
	LONG	i;
	LONG	j;
	LONG	k;
	LONG	l;

	// 计算结果
	FLOAT	fResult;


	// 暂时分配内存,以保存新图像
	hNewDIBBits = LocalAlloc(LHND, lLineBytes * lHeight);

	// 判断是否内存分配失败
	if (hNewDIBBits == NULL)
	{
		// 分配内存失败
		return FALSE;
	}

	// 锁定内存
	lpNewDIBBits = (char*)LocalLock(hNewDIBBits);

	// 初始化图像为原始图像
	memcpy(lpNewDIBBits, lpDIBBits, lLineBytes * lHeight);

	// 行(除去边缘几行)
	for (i = iTempMY; i < lHeight - iTempH + iTempMY + 1; i++)
	{
		// 列(除去边缘几列)
		for (j = iTempMX; j < lWidth - iTempW + iTempMX + 1; j++)
		{
			// 指向新DIB第i行,第j个象素的指针
			lpDst = (unsigned char*)lpNewDIBBits + lLineBytes * (lHeight - 1 - i) + j;

			fResult = 0;

			// 计算
			for (k = 0; k < iTempH; k++)
			{
				for (l = 0; l < iTempW; l++)
				{
					// 指向DIB第i - iTempMY + k行,第j - iTempMX + l个象素的指针
					lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i + iTempMY - k)
						+ j - iTempMX + l;

					// 保存象素值
					fResult += (*lpSrc) * fpArray[k * iTempW + l];
				}
			}

			// 乘上系数
			fResult = fResult * fCoef + fConst;

			// 取绝对值
			fResult = (FLOAT)fabs(fResult);

			// 判断是否超过255
			if (fResult > 255)
			{
				// 直接赋值为255
				*lpDst = 255;
			}
			else
			{
				// 赋值
				*lpDst = (unsigned char)(fResult + 0.5);
			}

		}
	}

	// 复制变换后的图像
	memcpy(lpDIBBits, lpNewDIBBits, lLineBytes * lHeight);

	// 释放内存
	LocalUnlock(hNewDIBBits);
	LocalFree(hNewDIBBits);

	// 返回
	return TRUE;

}

2.1.2平滑
运用到了高斯平滑和均值平滑。两者使用的模板和原理不同,但是要实现这两种效果可以使用相同的函数ZDYLJ()处理。
均值滤波的模板是[1 1 1 ,系数是1/9
1 1 1
1 1 1 ]
高斯滤波的模板是[1 2 1 , 系数是1/16
2 4 2
1 2 1]
1.3锐化
锐化使用了拉普拉斯算子即:[ -1 -1 -1
-1 9 -1
-1 -1 -1]
拉普拉斯锐化是采用拉普拉斯算子对图像进行操作。
锐化处理的主要目的是突出图像中的细节或者增强被模糊了的细节,这种模糊不是由于错误操作,就是特殊图像获取方法的固有影响。

2.1.4 边缘检测
使用sobel算子, 其水平模板为[1 2 1 ,垂直模板为[ -1 0 1
0 0 0 -2 0 2
-1 -2 -1] -1 0 1]
使用Prewiitt算子,其水平模板为[-1 -1 -1 , 垂直模板为[ -1 0 1
0 0 0 -1 0 1
1 1 1 ] -1 0 1]
水平模板对水平边缘影响最大,垂直模板对垂直模板影响最大
边缘检测能够使图像中的物体的边缘突出

2.1.5 浮雕
用到的算子 [-2 -1 0 ,系数是1.0
-1 1 1
0 1 2 ]

2.2 阈值分割算法
2.2.1 迭代法
1) 选择灰度值的平均值作为初始阈值T0
2) 对小于T的的像素的灰度值求平均值T1, 对大于T的的像素的灰度值求平均值T2
3) 新的T=(T1+T1)/2
重复第一到三步直到T=T0
2.2.2 OTSU法
本思想是使用一个阈值将整个数据分成两个类,假如两个类之间的方差最大,那么这个阈值就是最佳的阈值。

2.2.3 自适应分割法
把图像分成四部分,求出子图像的平均值,并分别对子图像进行处理

2.3 直方图均衡化
计算每种灰度值出现的次数,求出灰度映射表和新灰度值
3 算法的实现效果
3.1 自定义滤镜

反色

在这里插入图片描述

均值模糊
在这里插入图片描述

高斯模糊
在这里插入图片描述

自定义滤镜
在这里插入图片描述

浮雕
在这里插入图片描述
Sobel算子
垂直:
在这里插入图片描述
水平:
在这里插入图片描述
Prewitt算子
垂直:
在这里插入图片描述
水平:
在这里插入图片描述
保存算子
在这里插入图片描述
在这里插入图片描述
装载算子
在这里插入图片描述
在这里插入图片描述
#3.2 几何变换
3.2.1图像平移

在这里插入图片描述
3.2.2垂直镜像

在这里插入图片描述
3.23水平镜像
在这里插入图片描述
3.2.4图像缩放
在这里插入图片描述

3.2.5图像旋转

在这里插入图片描述
#阈值分割
迭代法
在这里插入图片描述
结果:
在这里插入图片描述
OTSU法:
在这里插入图片描述
结果:
在这里插入图片描述
自适应阈值分割:
在这里插入图片描述
#3.4窗口变换和灰度拉伸
在这里插入图片描述
在这里插入图片描述
灰度拉伸
在这里插入图片描述
在这里插入图片描述
#3.5直方图均衡化
在这里插入图片描述
在这里插入图片描述
#3.6风格化
油画滤镜
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
马赛克:
在这里插入图片描述

水彩画滤镜:在这里插入图片描述
在这里插入图片描述
#3.7 区域计数
先是对硬币图像使用阈值分割
8连通处理结果
在这里插入图片描述
在这里插入图片描述
还做了4连通和自动选择前景结果差不多
除了数量计算的都有问题好像是,记不清了
只能算硬币,算米粒数有问题
#3.8 Canny算子
在这里插入图片描述
在这里插入图片描述
贴部分代码

#pragma once
// MFCApplication2View.cpp: CMFCApplication2View 类的实现
#include "pch.h"
#include "framework.h"

// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
// ATL 项目中进行定义,并允许与该项目共享文档代码。
#ifndef SHARED_HANDLERS
#include "MFCApplication2.h"
#endif
#include "MFCApplication2Doc.h"
#include "MFCApplication2View.h"
#include"CDlgImgInfo.h"
#include"CDlgchangelightwo.h"
#include"CDlgHistogram.h"
#include"CDlg_Inverse_V.h"
#include"PointTrans.h"
#include"CDlgLinerPara.h"
#include"TemplateTrans.h"
//#include"function.h"
#include"CDlgSmooth.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#include "cDlgMorphErosion.h"
#include"cDlgMorphDilation.h"
#include"cDlgMorphOpen.h"
#include"cDlgMorphClose.h"
#include"morph.h"
#include"Erzhihua.h"
#include"restore.h"
#include "CDlgPointThre.h"
#include"detect.h"
#include"CDlgPointStre.h"
#include"CDlgGeoTran.h"
#include"GeoTrans.h"
#include"CDlgGeoZoom.h"
#include"CDlgPointWin.h"
#include"CDlgZdylvjing.h"
#include"CDlgGeoRota.h"
#include"ZDY.h"
#include"CDlgAREACOUNT.h"
#include"CDlgACRESULT.h"
#include"CDlgStyle.h"
#include"edgecontour.h"
//#include"GlobalApi.h"
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)
DECLARE_HANDLE(HDIB);
// CMFCApplication2View

IMPLEMENT_DYNCREATE(CMFCApplication2View, CView)

BEGIN_MESSAGE_MAP(CMFCApplication2View, CView)
	// 标准打印命令
	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
	ON_COMMAND(32771, &CMFCApplication2View::On32771)
	ON_COMMAND(ID_changelightwo, &CMFCApplication2View::Onchangelightwo)
	ON_COMMAND(ID_zhifangtu, &CMFCApplication2View::Onzhifangtu)
	ON_COMMAND(ID_PointInvert, &CMFCApplication2View::OnPointinvert)
	ON_COMMAND(ID_fanse, &CMFCApplication2View::Onfanse)
	ON_COMMAND(ID_LINECHANGE, &CMFCApplication2View::OnLinechange)
	ON_COMMAND(ID_Tran_L, &CMFCApplication2View::OnTranL)
	ON_COMMAND(ID_Tran_Reverse_L, &CMFCApplication2View::OnTranReverseL)
	ON_COMMAND(ID_Tran_V, &CMFCApplication2View::OnTranV)
	ON_COMMAND(ID_EnHaSoomth, &CMFCApplication2View::OnEnhasoomth)
	ON_COMMAND(ID_ENHA_SHARP, &CMFCApplication2View::OnEnhaSharp)
	ON_COMMAND(ID_GAOSI, &CMFCApplication2View::OnGaosi)
	ON_COMMAND(ID_morph, &CMFCApplication2View::Onmorph)
	ON_COMMAND(ID_Dilation, &CMFCApplication2View::OnDilation)
	ON_COMMAND(ID_Open, &CMFCApplication2View::OnOpen)
	ON_COMMAND(ID_Close, &CMFCApplication2View::OnClose)
	ON_COMMAND(ID_Erzhihua, &CMFCApplication2View::OnErzhihua)
	ON_COMMAND(ID_RESTORE_SALTNOISE, &CMFCApplication2View::OnRestoreSaltnoise)
	ON_COMMAND(ID_RESTORE_RANDOMNOISE, &CMFCApplication2View::OnRestoreRandomnoise)
	ON_COMMAND(ID_POINT_THRE, &CMFCApplication2View::OnPointThre)
	ON_COMMAND(ID_POINT_STRE, &CMFCApplication2View::OnPointStre)
	ON_COMMAND(ID_GEOM_TRAN, &CMFCApplication2View::OnGeomTran)
	ON_COMMAND(ID_GEOM_MIRV, &CMFCApplication2View::OnGeomMirv)
	ON_COMMAND(ID_GEOM_MIRH, &CMFCApplication2View::OnGeomMirh)
	ON_COMMAND(ID_GEOM_ZOOM, &CMFCApplication2View::OnGeomZoom)
	ON_COMMAND(ID_POINT_WIND, &CMFCApplication2View::OnPointWind)
	//ON_COMMAND(ID_POPUP_MASK, &CMFCApplication2View::OnPopupMask)
	ON_COMMAND(ID_ZDYLJ, &CMFCApplication2View::OnZdylj)
	ON_COMMAND(ID_GEOM_ROTA, &CMFCApplication2View::OnGeomRota)
	ON_COMMAND(ID_AREAC, &CMFCApplication2View::OnAreac)
	ON_COMMAND(ID_junheng, &CMFCApplication2View::Onjunheng)
	ON_COMMAND(ID_Waterp, &CMFCApplication2View::OnWaterp)
	ON_COMMAND(ID_Oilp, &CMFCApplication2View::OnOilp)
	ON_COMMAND(ID_Selfadapt, &CMFCApplication2View::OnSelfadapt)
	ON_COMMAND(ID_Canny, &CMFCApplication2View::OnCanny)
	ON_COMMAND(ID_PopupMask, &CMFCApplication2View::OnPopupmask)
END_MESSAGE_MAP()

// CMFCApplication2View 构造/析构

CMFCApplication2View::CMFCApplication2View() noexcept
{
	// TODO: 在此处添加构造代码

}

CMFCApplication2View::~CMFCApplication2View()
{
}

BOOL CMFCApplication2View::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改
	//  CREATESTRUCT cs 来修改窗口类或样式

	return CView::PreCreateWindow(cs);
}

// CMFCApplication2View 绘图

void CMFCApplication2View::OnDraw(CDC* pDC)
{
	CMFCApplication2Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	HGLOBAL hDIB = pDoc->GetHObject();

	// 判断DIB是否为空
	if (hDIB != NULL)
	{
		LPSTR lpDibSection = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);

		// 获取DIB宽度
		int cxDIB = (int)pDoc->m_dib.GetWidth(lpDibSection);

		// 获取DIB高度
		int cyDIB = (int)pDoc->m_dib.GetHeight(lpDibSection);
		::GlobalUnlock((HGLOBAL)hDIB);
		CRect rcDIB;
		rcDIB.top = rcDIB.left = 0;
		rcDIB.right = cxDIB;
		rcDIB.bottom = cyDIB;
		CRect rcDest = rcDIB;
		// 输出DIB
		pDoc->m_dib.DrawDib(pDC->m_hDC, &rcDest, pDoc->GetHObject(),
			&rcDIB, pDoc->GetDocPal());
	}

}


// CMFCApplication2View 打印

BOOL CMFCApplication2View::OnPreparePrinting(CPrintInfo* pInfo)
{
	// 默认准备
	return DoPreparePrinting(pInfo);
}

void CMFCApplication2View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 添加额外的打印前进行的初始化过程
}

void CMFCApplication2View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 添加打印后进行的清理过程
}


// CMFCApplication2View 诊断

#ifdef _DEBUG
void CMFCApplication2View::AssertValid() const
{
	CView::AssertValid();
}

void CMFCApplication2View::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMFCApplication2Doc* CMFCApplication2View::GetDocument() const // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCApplication2Doc)));
	return (CMFCApplication2Doc*)m_pDocument;
}
#endif //_DEBUG


// CMFCApplication2View 消息处理程序


void CMFCApplication2View::On32771()
{

	// 显示图像基本信息
	CMFCApplication2Doc* pDoc = GetDocument();// 获取文档	
		
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;      //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	/*
	if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
	{
		   AfxMessageBox(L"对不起,不是256色位图!");// 警告
		   ::GlobalUnlock((HGLOBAL) pDoc->GetHObject());// 解除锁定
		   return;									//返回
	 }										//判断是否是8-bpp位图,不是则返回
	 */
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
/	
	CDlgImgInfo dlgPara;// 创建对话框		
	dlgPara.m_Width = lSrcWidth;
	dlgPara.m_Height = lSrcHeight;
	dlgPara.m_bitCount = lpSrcBitCount;

	if (dlgPara.DoModal() != IDOK)// 显示对话框, 
	{
		return;
	}
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
}


void CMFCApplication2View::Onchangelightwo()
{
	// TODO: 在此添加命令处理程序代码

	// 显示图像基本信息
	CMFCApplication2Doc* pDoc = GetDocument();// 获取文档	
		
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;      //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	/*
	if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
	{
		   AfxMessageBox(L"对不起,不是256色位图!");// 警告
		   ::GlobalUnlock((HGLOBAL) pDoc->GetHObject());// 解除锁定
		   return;									//返回
	 }										//判断是否是8-bpp位图,不是则返回
	 */
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);	// 计算图象每行的字节数
	CDlgchangelightwo  dig;// 创建对话框	
	int offset;
	
	if (dig.DoModal() != IDOK)// 显示对话框, 
	{
		return;
	}
	offset = dig.m_light;
	ChangeGray(lpSrcStartBits, lpSrcBitCount, lSrcWidth, lSrcHeight, offset);
	//改变亮度IDC_Light
	//CString text;
	//GetDlgItemText(IDC_Light,text);
	//GetDlgItem(IDC_Light)->GetWindowTextW(text);
	//int n = _ttoi(text);
	//int n;
	//ChangeGray(lpSrcDib, lpSrcBitCount, lSrcWidth, lSrcHeight, dig.m_light);
	/*for (long i = 0;i < lSrcHeight;i++)
	{
		for (long j = 0;j < lSrcWidth;j++)
		{
			LPSTR lpSrc = lpSrcStartBits + lSrcLineBytes * i + j;
			*lpSrc = *lpSrc + dig.m_light;
			if (*lpSrc> 255)
			{
				*lpSrc=255;
			}
			if (*lpSrc <0)
			{
				*lpSrc = 0;
			}
		}

	}*/
	pDoc->SetModifiedFlag(true);
	pDoc->UpdateAllViews(NULL);
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
}


void CMFCApplication2View::Onzhifangtu()
{
	// 简单显示直方图
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;      //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	 lpDIB;
	LPSTR	lpSrcStartBits;	//指向源像素的指针  lpDIBBits;
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);	// 计算图象每行的字节数
	LONG i, j;
	LONG m_lCount[256];
	unsigned char* lpSrc;
	//LONG m_lWidth, m_lHeight;
	// 更改光标形状
	BeginWaitCursor();
	//计算直方图
	// 重置计数为0
	/*for (i = 0; i < 256; i++)
	{
		// 清零
		m_lCount[i] = 0;
	}

	for (i = 0; i < lSrcHeight; i++)
	{
		for (j = 0; j < lSrcWidth; j++)
		{
			lpSrc = (unsigned char*)lpSrcStartBits + lSrcLineBytes * i + j;
			// 计数加1
			m_lCount[*(lpSrc)]++;
		}
	}*/
	// 创建对话框
	CDlgHistogram dlgPara;
	//显示直方图
	// 初始化变量值
	dlgPara.m_lpDIBBits = lpSrcStartBits;
	dlgPara.m_lWidth = lSrcWidth;
	dlgPara.m_lHeight = lSrcHeight;
	dlgPara.m_iLowGray = 0;
	dlgPara.m_iHighGray = 255;
	dlgPara.m_lLineBytes = lSrcLineBytes;

	
	for (i = 0; i < 256; i++)
	{
		dlgPara.m_lCount[i] = m_lCount[i];
	}
	// 显示对话框
	if (dlgPara.DoModal() != IDOK) // 显示对话框 
	{
		return;
	}
	delete dlgPara;
	EndWaitCursor();
	//设置文档修改标志
	//  pDoc->SetModifiedFlag(true);
	//更新视图
	pDoc->UpdateAllViews(NULL);
	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

}



void CMFCApplication2View::OnPointinvert()//倒V
{
	// TODO: 在此添加命令处理程序代码
	CMFCApplication2Doc* pDoc = GetDocument();

	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
	{
		AfxMessageBox(L"对不起,不是256色位图!");// 警告
		::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
		return;									//返回
	}										//判断是否是8-bpp位图,不是则返回*/
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	// 	
	int threshold;

	CDlg_Inverse_V dlg;// 创建对话框	
	dlg.m_threshold = 128;
	if (dlg.DoModal() != IDOK)// 显示对话框 
	{
		return;
	}
	threshold = dlg.m_threshold;
	int type = 1;
	Segmental2_Linear_Tran(lpSrcStartBits, lSrcWidth, lSrcHeight, type, threshold);//分段线性变换
	
	pDoc->SetModifiedFlag(TRUE);
	pDoc->UpdateAllViews(NULL);
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}


void CMFCApplication2View::Onfanse()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
	{
		AfxMessageBox(L"对不起,不是256色位图!");// 警告
		::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
		return;									//返回
	}										//判断是否是8-bpp位图,不是则返回*/
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	

	//调用函数处理,图像反色
	FLOAT fA = -1.0;
	FLOAT fB = 255;
	LinerTrans(lpSrcStartBits, lSrcWidth,lSrcHeight,fA, fB);
	pDoc->SetModifiedFlag(TRUE);
	pDoc->UpdateAllViews(NULL);
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}


void CMFCApplication2View::OnLinechange()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	CDlgLinerPara dlg;// 创建对话框	
	dlg.m_fA = 1;
	dlg.m_fB = 0;
	if (dlg.DoModal() != IDOK)// 显示对话框 
	{
		return;
	}
	
	FLOAT fB,fA;
	
	fA = dlg.m_fA;
	fB = dlg.m_fB;
	LinerTrans(lpSrcStartBits, lSrcWidth, lSrcHeight, fA, fB);
	pDoc->SetModifiedFlag(TRUE);
	pDoc->UpdateAllViews(NULL);
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}


void CMFCApplication2View::OnTranL()
{
	CMFCApplication2Doc* pDoc = GetDocument();

	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
	{
		AfxMessageBox(L"对不起,不是256色位图!");// 警告
		::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
		return;									//返回
	}										//判断是否是8-bpp位图,不是则返回*/
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	// 	
	int threshold;

	CDlg_Inverse_V dlg;// 创建对话框	
	dlg.m_threshold = 128;
	/*if (dlg.DoModal() != IDOK)// 显示对话框 
	{
		return;
	}*/
	threshold = dlg.m_threshold;
	int type = 4;
	Segmental2_Linear_Tran(lpSrcStartBits, lSrcWidth, lSrcHeight, type, threshold);//分段线性变换

	pDoc->SetModifiedFlag(TRUE);
	pDoc->UpdateAllViews(NULL);
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}


void CMFCApplication2View::OnTranReverseL()
{
	CMFCApplication2Doc* pDoc = GetDocument();

	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
	{
		AfxMessageBox(L"对不起,不是256色位图!");// 警告
		::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
		return;									//返回
	}										//判断是否是8-bpp位图,不是则返回*/
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	// 	
	int threshold;

	CDlg_Inverse_V dlg;// 创建对话框	
	dlg.m_threshold = 128;
	/*if (dlg.DoModal() != IDOK)// 显示对话框 
	{
		return;
	}*/
	threshold = dlg.m_threshold;
	int type = 3;
	Segmental2_Linear_Tran(lpSrcStartBits, lSrcWidth, lSrcHeight, type, threshold);//分段线性变换

	pDoc->SetModifiedFlag(TRUE);
	pDoc->UpdateAllViews(NULL);
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}


void CMFCApplication2View::OnTranV()
{
	CMFCApplication2Doc* pDoc = GetDocument();

	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
	{
		AfxMessageBox(L"对不起,不是256色位图!");// 警告
		::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
		return;									//返回
	}										//判断是否是8-bpp位图,不是则返回*/
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	// 	
	int threshold;

	CDlg_Inverse_V dlg;// 创建对话框	
	dlg.m_threshold = 128;
	/*if (dlg.DoModal() != IDOK)// 显示对话框 
	{
		return;
	}*/
	threshold = dlg.m_threshold;
	int type = 2;
	Segmental2_Linear_Tran(lpSrcStartBits, lSrcWidth, lSrcHeight, type, threshold);//分段线性变换

	pDoc->SetModifiedFlag(TRUE);
	pDoc->UpdateAllViews(NULL);
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}


void CMFCApplication2View::OnEnhasoomth()
{
	CMFCApplication2Doc* pDoc = GetDocument();

	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
	{
		AfxMessageBox(L"对不起,不是256色位图!");// 警告
		::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
		return;									//返回
	}										//判断是否是8-bpp位图,不是则返回*/
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	int iTempH;
	int iTempW;
	int iTempMX;
	int iTempMY;
	FLOAT fTempC;
	FLOAT aValue[25];
	// 给模板数组赋初值(为平均模板)
	/*aValue[0] = 1;
	aValue[1] = 1;
	aValue[2] = 1;
	aValue[3] = 1;
	aValue[4] = 1;
	aValue[5] = 1;
	aValue[6] = 1;
	aValue[7] = 1;
	aValue[8] = 1;

		// 设定平移量(3*3)
	iTempH = 3;
	iTempW = 3;
	iTempMX = 1;
	iTempMY = 1;
	fTempC = (FLOAT)(1.0 / 9.0);*/
	/*CDlgSmooth dlgPara;
	
	if (dlgPara.DoModal() != IDOK)// 显示对话框 
		{
			return;
	}*/
	CDlgSmooth dlgPara;

	// 给模板数组赋初值(为平均模板)
	aValue[0] = 1.0;
	aValue[1] = 1.0;
	aValue[2] = 1.0;
	aValue[3] = 0.0;
	aValue[4] = 0.0;
	aValue[5] = 1.0;
	aValue[6] = 1.0;
	aValue[7] = 1.0;
	aValue[8] = 0.0;
	aValue[9] = 0.0;
	aValue[10] = 1.0;
	aValue[11] = 1.0;
	aValue[12] = 1.0;
	aValue[13] = 0.0;
	aValue[14] = 0.0;
	aValue[15] = 0.0;
	aValue[16] = 0.0;
	aValue[17] = 0.0;
	aValue[18] = 0.0;
	aValue[19] = 0.0;
	aValue[20] = 0.0;
	aValue[21] = 0.0;
	aValue[22] = 0.0;
	aValue[23] = 0.0;
	aValue[24] = 0.0;

	// 初始化对话框变量值
	dlgPara.m_intType = 0;
	dlgPara.m_iTempH = 3;
	dlgPara.m_iTempW = 3;
	dlgPara.m_iTempMX = 1;
	dlgPara.m_iTempMY = 1;
	dlgPara.m_fTempC = (FLOAT)(1.0 / 9.0);
	dlgPara.m_fpArray = aValue;

	// 显示对话框,提示用户设定平移量
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}

	// 获取用户设定的平移量
	iTempH = dlgPara.m_iTempH;
	iTempW = dlgPara.m_iTempW;
	iTempMX = dlgPara.m_iTempMX;
	iTempMY = dlgPara.m_iTempMY;
	fTempC = dlgPara.m_fTempC;

	// 删除对话框
	delete dlgPara;
	
	BeginWaitCursor();
	if (Template(lpSrcStartBits, lSrcWidth, lSrcHeight,
		iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC))
		// 调用Template()函数平滑DIB
	{
		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
	}
	
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
	// 恢复光标
	EndWaitCursor();

}


void CMFCApplication2View::OnEnhaSharp()//图像锐化 中值滤波
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
	{
		AfxMessageBox(L"对不起,不是256色位图!");// 警告
		::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
		return;									//返回
	}										//判断是否是8-bpp位图,不是则返回*/
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	// 模板高度
	int		iTempH;

	// 模板宽度
	int		iTempW;

	// 模板系数
	FLOAT	fTempC;

	// 模板中心元素X坐标
	int		iTempMX;

	// 模板中心元素Y坐标
	int		iTempMY;

	// 模板元素数组
	FLOAT	aValue[9];
	// 更改光标形状
	BeginWaitCursor();

	// 设置拉普拉斯模板参数
	iTempW = 3;
	iTempH = 3;
	fTempC = 1.0;
	iTempMX = 1;
	iTempMY = 1;
	aValue[0] = -1.0;
	aValue[1] = -1.0;
	aValue[2] = -1.0;
	aValue[3] = -1.0;
	aValue[4] = 9.0;
	aValue[5] = -1.0;
	aValue[6] = -1.0;
	aValue[7] = -1.0;
	aValue[8] = -1.0;

	// 调用Template()函数用拉普拉斯模板锐化DIB
	if (Template(lpSrcStartBits, lSrcWidth, lSrcHeight,
		iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC))
	{

		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
	}

	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
	// 恢复光标
	EndWaitCursor();
}


void CMFCApplication2View::OnGaosi()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
	{
		AfxMessageBox(L"对不起,不是256色位图!");// 警告
		::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
		return;									//返回
	}										//判断是否是8-bpp位图,不是则返回*/
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	int iTempH;
	int iTempW;
	int iTempMX;
	int iTempMY;
	FLOAT fTempC;
	FLOAT aValue[9];
	// 给模板数组赋初值
	aValue[0] = 1;
	aValue[1] = 2;
	aValue[2] = 1;
	aValue[3] = 2;
	aValue[4] = 4;
	aValue[5] = 2;
	aValue[6] = 1;
	aValue[7] = 2;
	aValue[8] = 1;

	// 设定平移量(3*3)
	iTempH = 3;
	iTempW = 3;
	iTempMX = 1;
	iTempMY = 1;
	fTempC = (FLOAT)(1.0 / 16.0);
	BeginWaitCursor();
	if (Template(lpSrcStartBits, lSrcWidth, lSrcHeight,
		iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC))
		// 调用Template()函数平滑DIB
	{

		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
	}

	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
	// 恢复光标
	EndWaitCursor();

}


void CMFCApplication2View::Onmorph()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
	{
		AfxMessageBox(L"对不起,不是256色位图!");// 警告
		::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
		return;									//返回
	}										//判断是否是8-bpp位图,不是则返回*/
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	int nMode;

	// 创建对话框
	
	cDlgMorphErosion dlgPara;

	// 初始化变量值
	dlgPara.m_nMode = 0;

	// 显示对话框,提示用户设定腐蚀方向
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}

	// 获取用户设定的腐蚀方向
	nMode = dlgPara.m_nMode;

	int structure[3][3];
	if (nMode == 2)
	{
		structure[0][0] = dlgPara.m_nStructure1;
		structure[0][1] = dlgPara.m_nStructure2;
		structure[0][2] = dlgPara.m_nStructure3;
		structure[1][0] = dlgPara.m_nStructure4;
		structure[1][1] = dlgPara.m_nStructure5;
		structure[1][2] = dlgPara.m_nStructure6;
		structure[2][0] = dlgPara.m_nStructure7;
		structure[2][1] = dlgPara.m_nStructure8;
		structure[2][2] = dlgPara.m_nStructure9;
	}

	// 删除对话框
	delete dlgPara;

	// 更改光标形状
	BeginWaitCursor();
	if (ErosionDIB(lpSrcStartBits, WIDTHBYTES(lSrcWidth * 8), lSrcHeight, nMode, structure))
	{

		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox(L"分配内存失败或者图像中含有0和255之外的像素值!",L"系统提示", MB_ICONINFORMATION | MB_OK);
	}



	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
	// 恢复光标
	EndWaitCursor();
}


void CMFCApplication2View::OnDilation()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
	{
		AfxMessageBox(L"对不起,不是256色位图!");// 警告
		::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
		return;									//返回
	}										//判断是否是8-bpp位图,不是则返回*/
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	int nMode;
	cDlgMorphDilation dlgPara;

	// 初始化变量值
	dlgPara.m_nMode = 0;

	// 显示对话框,提示用户设定膨胀方向
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}

	// 获取用户设定的膨胀方向
	nMode = dlgPara.m_nMode;

	int structure[3][3];
	if (nMode == 2)
	{
		structure[0][0] = dlgPara.m_nStructure1;
		structure[0][1] = dlgPara.m_nStructure2;
		structure[0][2] = dlgPara.m_nStructure3;
		structure[1][0] = dlgPara.m_nStructure4;
		structure[1][1] = dlgPara.m_nStructure5;
		structure[1][2] = dlgPara.m_nStructure6;
		structure[2][0] = dlgPara.m_nStructure7;
		structure[2][1] = dlgPara.m_nStructure8;
		structure[2][2] = dlgPara.m_nStructure9;
	}

	// 删除对话框
	delete dlgPara;

	// 更改光标形状
	BeginWaitCursor();
	if (DilationDIB(lpSrcStartBits, WIDTHBYTES(lSrcWidth * 8), lSrcHeight, nMode, structure))
	{

		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox(L"分配内存失败或者图像中含有0和255之外的像素值!",L"系统提示", MB_ICONINFORMATION | MB_OK);
	}


	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
	// 恢复光标
	EndWaitCursor();
}


void CMFCApplication2View::OnOpen()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
	{
		AfxMessageBox(L"对不起,不是256色位图!");// 警告
		::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
		return;									//返回
	}										//判断是否是8-bpp位图,不是则返回*/
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	int nMode;

	// 创建对话框
	cDlgMorphOpen dlgPara;

	// 初始化变量值
	dlgPara.m_nMode = 0;

	// 显示对话框,提示用户设定开运算方向
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}

	// 获取用户设定的开运算方向
	nMode = dlgPara.m_nMode;

	int structure[3][3];
	if (nMode == 2)
	{
		structure[0][0] = dlgPara.m_nStructure1;
		structure[0][1] = dlgPara.m_nStructure2;
		structure[0][2] = dlgPara.m_nStructure3;
		structure[1][0] = dlgPara.m_nStructure4;
		structure[1][1] = dlgPara.m_nStructure5;
		structure[1][2] = dlgPara.m_nStructure6;
		structure[2][0] = dlgPara.m_nStructure7;
		structure[2][1] = dlgPara.m_nStructure8;
		structure[2][2] = dlgPara.m_nStructure9;
	}

	// 删除对话框
	delete dlgPara;

	// 更改光标形状
	BeginWaitCursor();
	if (OpenDIB(lpSrcStartBits, lSrcWidth , lSrcHeight, nMode, structure))
	{

		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox(L"分配内存失败或者图像中含有0和255之外的像素值!",L"系统提示", MB_ICONINFORMATION | MB_OK);
	}
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
	// 恢复光标
	EndWaitCursor();
}


void CMFCApplication2View::OnClose()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
	{
		AfxMessageBox(L"对不起,不是256色位图!");// 警告
		::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
		return;									//返回
	}										//判断是否是8-bpp位图,不是则返回*/
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	int nMode;
	cDlgMorphClose dlgPara;

	// 初始化变量值
	dlgPara.m_nMode = 0;

	// 显示对话框,提示用户设定闭运算方向
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}

	// 获取用户设定的闭运算方向
	nMode = dlgPara.m_nMode;

	int structure[3][3];
	if (nMode == 2)
	{
		structure[0][0] = dlgPara.m_nStructure1;
		structure[0][1] = dlgPara.m_nStructure2;
		structure[0][2] = dlgPara.m_nStructure3;
		structure[1][0] = dlgPara.m_nStructure4;
		structure[1][1] = dlgPara.m_nStructure5;
		structure[1][2] = dlgPara.m_nStructure6;
		structure[2][0] = dlgPara.m_nStructure7;
		structure[2][1] = dlgPara.m_nStructure8;
		structure[2][2] = dlgPara.m_nStructure9;
	}

	// 删除对话框
	delete dlgPara;

	// 更改光标形状
	BeginWaitCursor();
	if (CloseDIB(lpSrcStartBits, WIDTHBYTES(lSrcWidth * 8), lSrcHeight, nMode, structure))
	{

		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox(L"分配内存失败或者图像中含有0和255之外的像素值!", L"系统提示", MB_ICONINFORMATION | MB_OK);
	}

	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
	// 恢复光标
	EndWaitCursor();
}


void CMFCApplication2View::OnErzhihua()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	/*if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图
	{
		AfxMessageBox(L"对不起,不是256色位图!");// 警告
		::GlobalUnlock((HGLOBAL)pDoc->GetHObject());// 解除锁定
		return;									//返回
	}										//判断是否是8-bpp位图,不是则返回*/
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	int bThre;
	CDlgErzhihua dlgPara;
	dlgPara.m_fazhi = 0;
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	bThre = dlgPara.m_fazhi;
	ThresholdTrans(lpSrcStartBits, lSrcWidth, lSrcHeight, bThre);


	pDoc->SetModifiedFlag(TRUE);
	pDoc->UpdateAllViews(NULL);
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}


void CMFCApplication2View::OnRestoreSaltnoise()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	// 更改光标形状
	BeginWaitCursor();

	// 找到DIB图像象素起始位置
	

	// 调用SaltNoiseDIB()函数对DIB进行加噪处理
	if (SaltNoiseDIB(lpSrcStartBits, lSrcWidth, lSrcHeight))
	{

		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
	}

	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();

}


void CMFCApplication2View::OnRestoreRandomnoise()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	// 更改光标形状
	BeginWaitCursor();

	// 找到DIB图像象素起始位置


	// 调用SaltNoiseDIB()函数对DIB进行加噪处理
	if (RandomNoiseDIB(lpSrcStartBits, lSrcWidth, lSrcHeight))
	{

		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
	}

	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();

}




void CMFCApplication2View::OnPointThre()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	CDlgPointThre  dlgPara;
	// 阈值
	BYTE	bThre;
	int s=0;
	// 初始化变量值
	dlgPara.m_bThre = 128;
	dlgPara.m_lpSrcStartBits = lpSrcStartBits;
	dlgPara.m_lSrcHeight = lSrcHeight;
	dlgPara.m_lSrcWidth = lSrcWidth;
	// 显示对话框,提示用户设定阈值
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	bThre = dlgPara.m_bThre;
	BeginWaitCursor();
		// 删除对话框
		delete dlgPara;

		// 更改光标形状
		BeginWaitCursor();
		
		// 调用ThresholdTrans()函数进行阈值变换
		ThresholdTrans(lpSrcStartBits, lSrcWidth, lSrcHeight, bThre);
	
	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);

	// 更新视图
	pDoc->UpdateAllViews(NULL);
	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();
}


void CMFCApplication2View::OnPointStre()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	CDlgPointStre dlgPara;

	// 点1坐标
	BYTE	bX1;
	BYTE	bY1;

	// 点2坐标
	BYTE	bX2;
	BYTE	bY2;
	// 初始化变量值
	dlgPara.m_bX1 = 50;
	dlgPara.m_bY1 = 30;
	dlgPara.m_bX2 = 200;
	dlgPara.m_bY2 = 220;

	// 显示对话框,提示用户设定拉伸位置
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}

	// 获取用户的设定
	bX1 = dlgPara.m_bX1;
	bY1 = dlgPara.m_bY1;
	bX2 = dlgPara.m_bX2;
	bY2 = dlgPara.m_bY2;

	// 删除对话框
	delete dlgPara;

	// 更改光标形状
	BeginWaitCursor();

	// 调用GrayStretch()函数进行灰度拉伸
	GrayStretch(lpSrcStartBits, lSrcWidth, lSrcHeight, bX1, bY1, bX2, bY2);

	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);

	// 更新视图
	pDoc->UpdateAllViews(NULL);
	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();
}


void CMFCApplication2View::OnGeomTran()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	LONG lXOffset;
	LONG lYOffset;
	// 创建对话框
	CDlgGeoTran dlgPara;

	// 初始化变量值
	dlgPara.m_XOffset = 100;
	dlgPara.m_YOffset = 100;

	// 显示对话框,提示用户设定平移量
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}

	// 获取用户设定的平移量
	lXOffset = dlgPara.m_XOffset;
	lYOffset = dlgPara.m_YOffset;

	// 删除对话框	
	delete dlgPara;

	// 更改光标形状
	BeginWaitCursor();
	if (lpSrcBitCount == 8)// 判断是否是8-bpp位图
	{
		if (TranslationDIB(lpSrcStartBits, lSrcWidth, lSrcHeight, lXOffset, lYOffset))
		{

			// 设置脏标记
			pDoc->SetModifiedFlag(TRUE);

			// 更新视图
			pDoc->UpdateAllViews(NULL);
		}
		else
		{
			// 提示用户
			MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
		}
	}
	if (lpSrcBitCount == 24)// 判断是否是24-bpp位图
	{
		if (TranslationDIB24(lpSrcStartBits, lSrcWidth, lSrcHeight, lXOffset, lYOffset))
		{

			// 设置脏标记
			pDoc->SetModifiedFlag(TRUE);

			// 更新视图
			pDoc->UpdateAllViews(NULL);
		}
		else
		{
			// 提示用户
			MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
		}
	}
	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();

}


void CMFCApplication2View::OnGeomMirv()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	LONG lXOffset;
	LONG lYOffset;
	// 更改光标形状
	BeginWaitCursor();

	// 调用MirrorDIB()函数垂直镜像DIB
	if (MirrorDIB(lpSrcStartBits, lSrcWidth, lSrcHeight, FALSE))
	{

		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
	}

	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();

}


void CMFCApplication2View::OnGeomMirh()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	LONG lXOffset;
	LONG lYOffset;
	// 更改光标形状
	BeginWaitCursor();
	if (lpSrcBitCount == 8)// 判断是否是8-bpp位图
	{
		if (MirrorDIB(lpSrcStartBits, lSrcWidth, lSrcHeight, TRUE))
		{

			// 设置脏标记
			pDoc->SetModifiedFlag(TRUE);

			// 更新视图
			pDoc->UpdateAllViews(NULL);
		}
		else
		{
			// 提示用户
			MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
		}
	}
	if (lpSrcBitCount == 24)// 判断是否是24-bpp位图
	{
		if (MirrorDIB24(lpSrcStartBits, lSrcWidth, lSrcHeight, TRUE))
		{

			// 设置脏标记
			pDoc->SetModifiedFlag(TRUE);

			// 更新视图
			pDoc->UpdateAllViews(NULL);
		}
		else
		{
			// 提示用户
			MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
		}
	}
	// 调用MirrorDIB()函数垂直镜像DIB
	

	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();

}


void CMFCApplication2View::OnGeomZoom()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	// 缩放比率
	float fXZoomRatio;
	float fYZoomRatio;

	// 创建对话框
	CDlgGeoZoom dlgPara;

	// 初始化变量值
	dlgPara.m_XZoom = 0.5;
	dlgPara.m_YZoom = 0.5;

	// 显示对话框,提示用户设定平移量
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}

	// 获取用户设定的平移量
	fXZoomRatio = dlgPara.m_XZoom;
	fYZoomRatio = dlgPara.m_YZoom;

	// 删除对话框
	delete dlgPara;
	// 创建新DIB
	HDIB hNewDIB = NULL;

	// 更改光标形状
	BeginWaitCursor();
	if (lpSrcBitCount == 8)// 判断是否是8-bpp位图
	{
		hNewDIB = (HDIB)ZoomDIB(lpSrcDib, lpSrcStartBits, lSrcWidth, lSrcHeight, fXZoomRatio, fYZoomRatio);
	}
	if (lpSrcBitCount == 24)// 判断是否是24-bpp位图
	{
		hNewDIB = (HDIB)ZoomDIB24(lpSrcDib, lpSrcStartBits, lSrcWidth, lSrcHeight, fXZoomRatio, fYZoomRatio);
	}
	// 调用ZoomDIB()函数转置DIB
	//hNewDIB = (HDIB)ZoomDIB(lpSrcDib, lpSrcStartBits,lSrcWidth, lSrcHeight,fXZoomRatio, fYZoomRatio);

	// 判断缩放是否成功
	if (hNewDIB != NULL)
	{

		pDoc->UpdateObject(hNewDIB);

		// 更新DIB大小和调色板
		pDoc->SetDib();

		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 重新设置滚动视图大小
		//SetScrollSizes(MM_TEXT, pDoc->GetDocSize());

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
	}

	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();
	
}


void CMFCApplication2View::OnPointWind()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	// 创建对话框
	CDlgPointWin  dlgPara;
	// 窗口下限
	BYTE	bLow;

	// 窗口上限
	BYTE	bUp;
	// 初始化变量值
	dlgPara.m_bLow = 0;
	dlgPara.m_bUp = 255;

	// 显示对话框,提示用户设定窗口上下限
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}

	// 获取用户设定的窗口上下限
	bLow = dlgPara.m_bLow;
	bUp = dlgPara.m_bUp;

	// 删除对话框
	delete dlgPara;

	// 更改光标形状
	BeginWaitCursor();

	// 调用WindowTrans()函数进行窗口变换
	WindowTrans(lpSrcStartBits, lSrcWidth, lSrcHeight, bLow, bUp);

	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);

	// 更新视图
	pDoc->UpdateAllViews(NULL);

	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();
}


void CMFCApplication2View::OnZdylj()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	// 模板元素数组
	FLOAT	aValue[9];
	int type;
	CDlgZdylvjing dlgPara;
	aValue[0] = 1.0;
	aValue[1] = 1.0;
	aValue[2] = 1.0;
	aValue[3] = 0.0;
	aValue[4] = 0.0;
	aValue[5] = 1.0;
	aValue[6] = 1.0;
	aValue[7] = 1.0;
	aValue[8] = 0.0;
	dlgPara.m_fTempC = (FLOAT)(1.0 / 9.0);
	dlgPara.m_fpArray = aValue;
	dlgPara.m_pDoc = pDoc;
	dlgPara.m_bThre = 128;
	// 显示对话框,提示用户设定窗口上下限
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	// 更改光标形状
	BeginWaitCursor();

	//ZDYLJ(lpSrcStartBits, lSrcWidth, lSrcHeight, dlgPara.m_intType);
	delete dlgPara;
	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);

	// 更新视图
	pDoc->UpdateAllViews(NULL);

	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();
}


void CMFCApplication2View::OnGeomRota()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//

	// 缩放比率
	int iRotateAngle;

	// 创建对话框
	CDlgGeoRota dlgPara;

	// 初始化变量值
	dlgPara.m_iRotateAngle = 90;

	// 显示对话框,提示用户设定旋转角度
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}

	// 获取用户设定的平移量
	iRotateAngle = dlgPara.m_iRotateAngle;

	// 删除对话框
	delete dlgPara;


	// 创建新DIB
	HDIB hNewDIB = NULL;

	// 更改光标形状
	BeginWaitCursor();
	if (lpSrcBitCount == 8)// 判断是否是8-bpp位图
	{
		hNewDIB = (HDIB)RotateDIB(lpSrcDib, iRotateAngle);
	}
	if (lpSrcBitCount == 24)// 判断是否是24-bpp位图
	{
		hNewDIB = (HDIB)RotateDIB24(lpSrcDib, iRotateAngle);
	}
	// 调用RotateDIB()函数旋转DIB
	//hNewDIB = (HDIB)RotateDIB(lpSrcDib, iRotateAngle);

	// 判断旋转是否成功
	if (hNewDIB != NULL)
	{
		pDoc->UpdateObject(hNewDIB);

		// 更新DIB大小和调色板
		pDoc->SetDib();


		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 重新设置滚动视图大小
		//SetScrollSizes(MM_TEXT, pDoc->GetDocSize());

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox(L"分配内存失败!", L"系统提示", MB_ICONINFORMATION | MB_OK);
	}

	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();




}


void CMFCApplication2View::OnAreac()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	int my_number = 0;
	double my_area = 0;
	double my_meter;
	double my_circle;
	double my_square;
	// 更改光标形状
	BeginWaitCursor();
	int colo, lian;
	CDlgAREACOUNT dlgPara;
	if (dlgPara.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	delete dlgPara;
	lian = dlgPara.m_lian;
	colo = dlgPara.m_color;
	int s = 1;
	if (lian == 4 )
	{
		/*FLOAT fA = -1.0;
		FLOAT fB = 255;
		LinerTrans(lpSrcStartBits, lSrcWidth, lSrcHeight, fA, fB);*/
		if(colo == 1) 
		{
			my_number = dealer_four(lpSrcStartBits, lSrcWidth, lSrcHeight, 0);
			my_area = getArea_four(lpSrcStartBits, lSrcWidth, lSrcHeight, 0);
			my_meter = sqrt(my_area / 3.14) * 2 * 3.14;
			my_circle = (4 * PI * my_area) / (my_meter * my_meter);	//0.6868*my_meter*my_meter / my_area;
			my_square = 0.5483*my_circle;		
		}
		if(colo == 2)
		{
			my_number = dealer_four(lpSrcStartBits, lSrcWidth, lSrcHeight, 255);
			my_area = getArea_four(lpSrcStartBits, lSrcWidth, lSrcHeight, 255);
			my_meter = sqrt(my_area / 3.14) * 2 * 3.14;
			my_circle =( 4 * PI * my_area) / (my_meter * my_meter);
			my_square = 0.5483*my_circle;
		}
		if (colo == 3)
		{
			unsigned char* img;
			int black = 0, white = 0;
			for (int i = 0; i < lSrcHeight; i++) {
				for (int j = 0; j < lSrcWidth; j++) {
					img = (unsigned char*)lpSrcStartBits + lSrcLineBytes * (lSrcHeight - 1 - i) + j;//i行j列
					if (*img == 0)
						black++;
					else
						white++;
				}
			}
			if (black >= white)//白
			{
				my_number = dealer_four(lpSrcStartBits, lSrcWidth, lSrcHeight, 255);
				my_area = getArea_four(lpSrcStartBits, lSrcWidth, lSrcHeight, 255);
				my_meter = sqrt(my_area / 3.14) * 2 * 3.14;
				my_circle =( 4 * PI* my_area )/ (my_meter * my_meter);
				my_square = 0.5483 * my_circle;
			}
			else//黑
			{
				my_number = dealer_four(lpSrcStartBits, lSrcWidth, lSrcHeight, 0);
				my_area = getArea_four(lpSrcStartBits, lSrcWidth, lSrcHeight, 0);
				my_meter = sqrt(my_area / 3.14) * 2 * 3.14;
				my_circle = 4 * PI * my_area / (my_meter * my_meter);
				my_square = 0.5483 * my_circle;
			}
		}
	}
	if (lian == 8)
	{
		if (colo == 1)
		{
			my_number = dealer_eight(lpSrcStartBits, lSrcWidth, lSrcHeight, 0);
			my_area = getArea_eight(lpSrcStartBits, lSrcWidth, lSrcHeight, 0);
			my_meter = sqrt(my_area / 3.14) * 2 * 3.14;
			my_circle = 4 * PI * my_area / (my_meter * my_meter);
			my_square = 0.5483 * my_circle;
		}
		if (colo == 2)
		{
			my_number = dealer_eight(lpSrcStartBits, lSrcWidth, lSrcHeight, 255);
			my_area = getArea_eight(lpSrcStartBits, lSrcWidth, lSrcHeight, 255);
			my_meter = sqrt(my_area / 3.14) * 2 * 3.14;
			my_circle = 4 * PI * my_area / (my_meter * my_meter);
			my_square = 0.5483 * my_circle;
		}
		if (colo == 3)
		{
			unsigned char* img;
			int black = 0, white = 0;
			for (int i = 0; i < lSrcHeight; i++) {
				for (int j = 0; j < lSrcWidth; j++) {
					img = (unsigned char*)lpSrcStartBits + lSrcLineBytes * (lSrcHeight - 1 - i) + j;//i行j列
					if (*img == 0)
						black++;
					else
						white++;
				}
			}
			if (black >= white)//白
			{
				my_number = dealer_eight(lpSrcStartBits, lSrcWidth, lSrcHeight, 255);
				my_area = getArea_eight(lpSrcStartBits, lSrcWidth, lSrcHeight, 255);
				my_meter = sqrt(my_area / 3.14) * 2 * 3.14;
				my_circle = 4 * PI * my_area / (my_meter * my_meter);
				my_square = 0.5483 * my_circle;
			}
			else//黑
			{
				my_number = dealer_eight(lpSrcStartBits, lSrcWidth, lSrcHeight, 0);
				my_area = getArea_eight(lpSrcStartBits, lSrcWidth, lSrcHeight, 0);
				my_meter = sqrt(my_area / 3.14) * 2 * 3.14;
				my_circle = 4 * PI * my_area / (my_meter * my_meter);
				my_square = 0.5483 * my_circle;	
			}
		}
	}
	//分割迭代法  反色 提取 生长
	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);

	// 更新视图
	pDoc->UpdateAllViews(NULL);

	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();

	BeginWaitCursor();
	CDlgACRESULT  dlg;
	dlg.m_Num = my_number;
	dlg.m_mSquare = my_area;
	dlg.m_mCmeter =my_meter;
	dlg.m_circle = my_circle;
	dlg.m_square = my_square;
	dlg.m_x = heartx(lSrcWidth, lSrcHeight, my_area);
	dlg.m_y = gethearty(lSrcWidth, lSrcHeight, my_area);
	if (dlg.DoModal() != IDOK)
	{
		// 返回
		return;
	}

	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}


void CMFCApplication2View::Onjunheng()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	// 更改光标形状
	BeginWaitCursor();

	InteEqualize(lpSrcStartBits, lSrcWidth, lSrcHeight);
	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);

	// 更新视图
	pDoc->UpdateAllViews(NULL);

	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();
}


void CMFCApplication2View::OnWaterp()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	// 更改光标形状
	BeginWaitCursor();
	CDlgStyle dlg;
	dlg.m_style = 40;
	if (dlg.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	int s = dlg.m_style;
	Waterpaint(lpSrcStartBits, lSrcWidth, lSrcHeight,s);

	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);

	// 更新视图
	pDoc->UpdateAllViews(NULL);

	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();
}

void CMFCApplication2View::OnOilp()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	// 更改光标形状
	BeginWaitCursor();
	CDlgStyle dlg;
	dlg.m_style = 30;
	if (dlg.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	int s = dlg.m_style;
	Oilpaint(lpSrcStartBits, lSrcWidth, lSrcHeight,s);

	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);

	// 更新视图
	pDoc->UpdateAllViews(NULL);

	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();
}


void CMFCApplication2View::OnSelfadapt()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	// 更改光标形状
	BeginWaitCursor();
	Selfadapt(lpSrcStartBits, lSrcWidth, lSrcHeight);
	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);

	// 更新视图
	pDoc->UpdateAllViews(NULL);

	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();
}


void CMFCApplication2View::OnCanny()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	// 更改光标形状
	BeginWaitCursor();
	// 循环控制变量
	int y;
	int x;

	// 开辟内存,存储图像数据
	unsigned char* pUnchImage = new unsigned char[lSrcWidth * lSrcHeight];

	for (y = 0; y < lSrcHeight; y++)
	{
		for (x = 0; x < lSrcWidth; x++)
		{
			pUnchImage[y * lSrcWidth + x] = lpSrcStartBits[y * lSrcLineBytes + x];
		}
	}

	// canny 算子计算后的结果
	unsigned char* pUnchEdge = new unsigned char[lSrcWidth * lSrcHeight];

	// 调用 canny 函数进行边界提取
	Canny(pUnchImage, lSrcWidth, lSrcHeight, 0.4, 0.4, 0.79, pUnchEdge);

	for (y = 0; y < lSrcHeight; y++)
	{
		for (x = 0; x < lSrcWidth; x++)
		{
			lpSrcStartBits[y * lSrcWidth + x] = (unsigned char)(255 - pUnchEdge[y * lSrcWidth + x]);
		}
	}

	// 释放内存
	delete[]pUnchImage;
	pUnchImage = NULL;
	delete[]pUnchEdge;
	pUnchEdge = NULL;
	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);

	// 更新视图
	pDoc->UpdateAllViews(NULL);

	// 解除锁定
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());

	// 恢复光标
	EndWaitCursor();
}


void CMFCApplication2View::OnPopupmask()
{
	CMFCApplication2Doc* pDoc = GetDocument();
	long	lSrcLineBytes;		//图象每行的字节数
	long	lSrcWidth;         //图象的宽度和高度
	long	lSrcHeight;
	int     lpSrcBitCount;       //图像的位深
	LPSTR	lpSrcDib;		//指向源图象的指针	
	LPSTR	lpSrcStartBits;	//指向源像素的指针
	lpSrcDib = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject());// 锁定DIB
	if (!lpSrcDib) return;
	lpSrcStartBits = pDoc->m_dib.GetBits(lpSrcDib);			// 找到DIB图象像素起始位置	
	lSrcWidth = pDoc->m_dib.GetWidth(lpSrcDib);					// 获取图象的宽度		
	lSrcHeight = pDoc->m_dib.GetHeight(lpSrcDib);					// 获取图象的高度	
	lpSrcBitCount = pDoc->m_dib.GetBitCount(lpSrcDib);                    //获取图像位深
	lSrcLineBytes = pDoc->m_dib.GetReqByteWidth(lSrcWidth * lpSrcBitCount);		// 计算图象每行的字节数
	//
	int i, j, ii, jj;
	LPSTR	lpDst1;
	for (i = 0; i <lSrcHeight; i++)
	{
		for (j = 0; j <lSrcWidth; j++)
		{
			ii = int(i / 8) * 8;
			jj = int(j / 8) * 8;
			lpDst1 = lpSrcStartBits+ii * lSrcWidth + jj;
			lpSrcDib = (char*)lpSrcStartBits + lSrcWidth * i + j;
			*lpSrcDib = *lpDst1;
		}
	}
	pDoc->SetModifiedFlag(TRUE);
	pDoc->UpdateAllViews(NULL);
	::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
}

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
半影调是一种图像处理技术,可以将图像变得更加柔和、自然,给人一种艺术感。在C语言和MFC中,实现半影调可以使用以下步骤: 1. 读取图像文件,将图像数据存储在内存中。 2. 将图像转换为灰度图像,可以使用灰度化方法,如平均值法、加权平均法、最大值法、最小值法等。 3. 将灰度图像分成多个小块,每个小块的大小可以根据需要进行调整。 4. 对于每个小块,计算该块的平均灰度值。 5. 将该小块中每个像素的灰度值减去该块的平均灰度值,得到该像素的半影调值。 6. 将处理后的图像保存到文件或显示在屏幕上。 以下是使用C语言和MFC实现图像半影调的代码示例: ```c++ #include <iostream> #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat image = imread("image.jpg"); // 读取图像文件 if (image.empty()) { std::cout << "Could not open or find the image" << std::endl; return -1; } cvtColor(image, image, CV_BGR2GRAY); // 将图像转换为灰度图像 int blockSize = 16; // 定义小块的大小 int height = image.rows; int width = image.cols; int blockRows = height / blockSize; // 计算小块的行数 int blockCols = width / blockSize; // 计算小块的列数 for (int i = 0; i < blockRows; i++) { for (int j = 0; j < blockCols; j++) { int sum = 0; for (int k = i * blockSize; k < (i + 1) * blockSize; k++) { for (int l = j * blockSize; l < (j + 1) * blockSize; l++) { sum += image.at<uchar>(k, l); // 计算小块的灰度值之和 } } int average = sum / (blockSize * blockSize); // 计算小块的平均灰度值 for (int k = i * blockSize; k < (i + 1) * blockSize; k++) { for (int l = j * blockSize; l < (j + 1) * blockSize; l++) { int value = image.at<uchar>(k, l) - average; // 计算半影调值 if (value < 0) { value = 0; } image.at<uchar>(k, l) = value; // 更新像素值 } } } } imshow("Image", image); // 显示处理后的图像 waitKey(0); return 0; } ``` 在以上代码中,使用了OpenCV库中的函数来读取和显示图像,也使用了OpenCV中的Mat类来存储图像数据。通过双重循环遍历小块中的每个像素,计算小块的平均灰度值和每个像素的半影调值,并更新像素值。最后,使用imshow函数显示处理后的图像,使用waitKey函数等待用户按下任意键退出程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值