图像处理基础框架及典型算法实现程序设计使用高级程序设计语言完成遥感图像的显示、放大、缩小、平移等常用的也是必须的图像显示操作,建立简单的遥感图像处理界面,在该界面上完成图像的打开、图像的显示、图像的处理、结果图像的保存等等。要求使用高级程序语言完成设计和实现,不得直接使用商用软件做二次开发。涉及的知识点包括:图像格式、图像的读写、显示,图像增强、图像分割、形态学处理等等遥感数字图像处理课程中学过的典型算法。具体内容包括:1)完成图像处理界面的构建,界面上有打开图像、处理图像、保存图像的菜单栏或工具栏。点击打开图像按钮能实现对话框形式交互找到要打开的图像,点击保存图像,能将图像另存到需要的文件夹下。2)实现bmp、jpg、tiff等图像格式的读写,学会调用图像处理库函数,实现不同格式图像文件的读和保存;(此部分内容让同学复习数字图像数据的本质,知道对图像进行处理本质上是对像素进行处理、不管什么格式的图像,重要的是读出里面的像素,各种格式图像只是读入方法不一样,对图像获得像素后,其他处理过程都相同) 3)完成图像处理函数的实现,需要完成灰度图像拉伸,图像增强、图像分割等算法,学会函数的定义,函数的调用;需要设计相应的菜单,完成相应的操作,处理结果直接实时显示在屏幕上,并且处理结果可以保存出来。(每位同学至少完成两个算法,而且必须有一个与图像卷积有关的算法) 特别注意:全部过程需要高级程序语言实现,充分理解图像处理的底层开发过程,深入理解图像处理的理论和方法。(后面给了部分参考方法和程序)
// 图像处理Doc.cpp: C图像处理Doc 类的实现
//
#include "pch.h"
#include "framework.h"
// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
// ATL 项目中进行定义,并允许与该项目共享文档代码。
#ifndef SHARED_HANDLERS
#include "图像处理.h"
#endif
#include "图像处理Doc.h"
#include <propkey.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// C图像处理Doc
IMPLEMENT_DYNCREATE(C图像处理Doc, CDocument)
BEGIN_MESSAGE_MAP(C图像处理Doc, CDocument)
ON_COMMAND(ID_IMG_READ, &C图像处理Doc::OnImgRead)
ON_COMMAND(ID_GRAY_EXCHANGE, &C图像处理Doc::OnGrayExchange)
ON_COMMAND(ID_IMG_SAVE, &C图像处理Doc::OnImgSave)
ON_COMMAND(ID_IMG_READ1, &C图像处理Doc::OnImgRead1)
ON_COMMAND(ID_TXZQ_ZZLB, &C图像处理Doc::OnTxzqZzlb)
ON_COMMAND(ID_RH_PREWITT, &C图像处理Doc::OnRhPrewitt)
ON_COMMAND(ID_RH_LAPLACIAN, &C图像处理Doc::OnRhLaplacian)
END_MESSAGE_MAP()
// C图像处理Doc 构造/析构
C图像处理Doc::C图像处理Doc() noexcept
{
// TODO: 在此添加一次性构造代码
}
C图像处理Doc::~C图像处理Doc()
{
}
BOOL C图像处理Doc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: 在此添加重新初始化代码
// (SDI 文档将重用该文档)
return TRUE;
}// C图像处理Doc 序列化
void C图像处理Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 在此添加存储代码
}
else
{
// TODO: 在此添加加载代码
}
}
#ifdef SHARED_HANDLERS
// 缩略图的支持
void C图像处理Doc::OnDrawThumbnail(CDC& dc, LPRECT lprcBounds)
{
// 修改此代码以绘制文档数据
dc.FillSolidRect(lprcBounds, RGB(255, 255, 255));
CString strText = _T("TODO: implement thumbnail drawing here");
LOGFONT lf;
CFont* pDefaultGUIFont = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));
pDefaultGUIFont->GetLogFont(&lf);
lf.lfHeight = 36;
CFont fontDraw;
fontDraw.CreateFontIndirect(&lf);
CFont* pOldFont = dc.SelectObject(&fontDraw);
dc.DrawText(strText, lprcBounds, DT_CENTER | DT_WORDBREAK);
dc.SelectObject(pOldFont);
}
// 搜索处理程序的支持
void C图像处理Doc::InitializeSearchContent()
{
CString strSearchContent;
// 从文档数据设置搜索内容。
// 内容部分应由“;”分隔
// 例如: strSearchContent = _T("point;rectangle;circle;ole object;");
SetSearchContent(strSearchContent);
}
void C图像处理Doc::SetSearchContent(const CString& value)
{
if (value.IsEmpty())
{
RemoveChunk(PKEY_Search_Contents.fmtid, PKEY_Search_Contents.pid);
}
else
{
CMFCFilterChunkValueImpl *pChunk = nullptr;
ATLTRY(pChunk = new CMFCFilterChunkValueImpl);
if (pChunk != nullptr)
{
pChunk->SetTextValue(PKEY_Search_Contents, value, CHUNK_TEXT);
SetChunkValue(pChunk);
}
}
}
#endif // SHARED_HANDLERS
// C图像处理Doc 诊断
#ifdef _DEBUG
void C图像处理Doc::AssertValid() const
{
CDocument::AssertValid();
}
void C图像处理Doc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
// C图像处理Doc 命令
void C图像处理Doc::OnImgRead()
{
// TODO: 在此添加命令处理程序代码
CString filename;
CString szfilter = _T("BMP Files(*.bmp)|*.bmp|BMP Files(*.bmp)|*.bmp|JPG Files(*.jpg)|*.jpg|All Files(*.*)|(*.*)||");
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, szfilter, NULL);
if (dlg.DoModal() == IDOK)
{
filename = dlg.GetPathName();
}
else
return;
//filename=_T("E:\\桌面\\图像处理\\数据\\设计1\\rest.raw",);
if (!(m_Img.Load(filename)))
{
AfxMessageBox(_T(" 图像打开失败"));
return;
}
Width = m_Img.GetWidth();
Height = m_Img.GetHeight();
gray = m_Img.GetBits();
UpdateAllViews(NULL);
}
void C图像处理Doc::OnGrayExchange()
{
// TODO: 在此添加命令处理程序代码
result = new unsigned char[Height*Width];//分配内存
unsigned char maxg, ming;
maxg = 0; // 灰度最大值,初始化为0
ming = 255; // 灰度最小值,初始化为255
float a, b; // 灰度线性拉伸两个参数
for (int i = 0; i < Height; i )
{
for (int j = 0; j < Width; j )
{
// 只要比当前的最大值还大
// 它就是新的最大值
if (maxg < gray[i * Width j])
maxg = gray[i * Width j];
// 只要比当前的最小值还小
// 它就是新的最小值
else if (ming > gray[i * Width j])
ming = gray[i * Width j];
}
}
// 求线性拉伸的两个参数
// 解下面的方程组得到a,b
// 255 = a*maxg b
// 0 = a*ming b
// 写成255.0f在计算时就当作浮点型了
a = 255.0f / (maxg - ming);
b = -255.0f * ming/(maxg - ming);
// 创建线性查找表,用公式y=ax b计算
unsigned char newgrey[256];
for (int i = 0; i < 256; i )
{
// 加上0.5再作强制转换便可达到四舍五入的效果
newgrey[i] = (unsigned char)(a * i b 0.5);
}
// 进行线性拉伸
for (int i = 0; i < Height; i )
{
for (int j = 0; j < Width; j )
{
// 由原始灰度从线性查找表中找到新的灰度
result[i*Width j] = newgrey[gray[i * Width j]];
}
}
AfxMessageBox(_T("图像处理成功,可进行图像保存等后续操作"));
m_Result_Img.CreateFromArray(result,Width,Height,8,Width,0);
}
void C图像处理Doc::OnImgSave()
{
// TODO: 在此添加命令处理程序代码
if (!m_Img.IsValid())
{
AfxMessageBox(_T("请先处理影像得到结果影像"));
}
CString filename;
CString szfilter = _T("BMP Files(*.bmp)|*.bmp|JPG Files(*.jpg)|*.jpg|All Files(*.*)|(*.*)||");
CFileDialog dlg(FALSE, _T("bmp"), NULL, OFN_HIDEREADONLY, szfilter, NULL);
if (dlg.DoModal() == IDOK)
{
filename = dlg.GetPathName();
}
else return;
//filename=_T("E:\\桌面\\图像处理\\数据\\设计1\\result2.bmp");
m_Result_Img.Save(filename, CXIMAGE_FORMAT_BMP);
AfxMessageBox(_T("结果影像成功保存到指定地址"));
}
void C图像处理Doc::OnImgRead1()
{
// TODO: 在此添加命令处理程序代码
Height = 1210;
Width = 1024;
gray = new unsigned char[Height * Width];// 分配内存
FILE* ftest;// 文件指针
fopen_s(&ftest, "E:\\桌面\\图像处理\\数据\\设计1\\test.raw", "rb"); // 以二进制读的方式打开原始台rax文件
if (!ftest)
AfxMessageBox(_T("图像打开失败,请检查图像地址是否正确"));
//从原始文件中读取灰度值到数组
fread(gray, sizeof(unsigned char), Height * Width, ftest);
//这个函数第一个参数是要保存读取到怕数据的指针
//这里我们将读取到的数据保存在灰度数组中
//第二个参数是单个数据的长度,即每个像素占的字节
//第三个参数是数据的个数,即像素个数
//第四个参数是文件指针,即从哪个文件中读
//关闭文件.
fclose(ftest);
AfxMessageBox(_T("图像打开成功,可进行图像处理等后续操作"));
}
void C图像处理Doc::OnGrayExchange1()
{
// TODO: 在此添加命令处理程序代码
result = new unsigned char[Height * Width];//分配内存
unsigned char maxg, ming;
maxg = 0; // 灰度最大值,初始化为0
ming = 255; // 灰度最小值,初始化为255
float a, b; // 灰度线性拉伸两个参数
for (int i = 0; i < Height; i )
{
for (int j = 0; j < Width; j )
{
// 只要比当前的最大值还大
// 它就是新的最大值
if (maxg < gray[i * Width j])
maxg = gray[i * Width j];
// 只要比当前的最小值还小
// 它就是新的最小值
else if (ming > gray[i * Width j])
ming = gray[i * Width j];
}
}
// 求线性拉伸的两个参数
// 解下面的方程组得到a,b
// 255 = a*maxg b
// 0 = a*ming b
// 写成255.0f在计算时就当作浮点型了
a = 255.0f / (maxg - ming);
b = -255.0f * ming / (maxg - ming);
// 创建线性查找表,用公式y=ax b计算
unsigned char newgrey[256];
for (int i = 0; i < 256; i )
{
// 加上0.5再作强制转换便可达到四舍五入的效果
newgrey[i] = (unsigned char)(a * i b 0.5);
}
// 进行线性拉伸
for (int i = 0; i < Height; i )
{
for (int j = 0; j < Width; j )
{
// 由原始灰度从线性查找表中找到新的灰度
result[i * Width j] = newgrey[gray[i * Width j]];
}
}
AfxMessageBox(_T("图像处理成功,可进行图像保存等后续操作"));
m_Result_Img.CreateFromArray(result, Width, Height, 8, Width, 0);
}
void C图像处理Doc::OnTxzqZzlb()
{
// TODO: 在此添加命令处理程序代码
if (!m_Img.IsValid())
{
AfxMessageBox(_T("请先打开图像"));
return;
}
int W = m_Img.GetWidth();
int H = m_Img.GetHeight();
AfxMessageBox(_T("已完成图像中值滤波"));
//unsigned char *gray;
//gray = (unsigned char*)malloc(sizeof(char)*H*W);
//FILE*fp;
//fopen_s(&fp, "E:\\桌面\\图像处理\\数据\\设计1\\test.raw", "rb");
//fread(gray,sizeof(unsigned char),H*W,fp);
int TempH = 3, TempW = 3;
unsigned char*Tgray;
Tgray = (unsigned char*)malloc(sizeof(char)*TempH*TempW);
unsigned char *gray_result;
gray_result = (unsigned char*)malloc(sizeof(char)*H*W);
int i, j, k, l, m, n;
unsigned char g;
for (i = TempH / 2;i < (H - TempH / 2); i )
for (j = TempW / 2; j < (W - TempW / 2); j )
{
for (k = 0; k < TempH; k )
for (l = 0; l < TempW; l )
Tgray[k*TempW 1] = gray[(i - TempH / 2 k)*W (j - TempW / 2 1)];
for (m = 0;m < TempH*TempW - 1; m )
for (n = m;n < TempH*TempW; n )
if (Tgray[m] > Tgray[n])
{
g = Tgray[m];
Tgray[m] = Tgray[n];
Tgray[n] = g;
}
gray_result[i*W j] = Tgray[(TempH*TempW) / 2];
}
m_Result_Img.CreateFromArray(gray_result, W, H, 8, W, 0);
/*FILE*pfile;
fopen_s(&pfile,"E:\\桌面\\图像处理\\数据\\设计1\\test123.raw", "wb");
fwrite(gray_result,1,H*W,pfile);
fclose(fp);
fclose(pfile);*/
}
void C图像处理Doc::OnRhPrewitt()
{
// TODO: 在此添加命令处理程序代码
//将图像中的灰度值读入数组中
//unsigned char *gray;
//gray = (unsigned char *)malloc(sizeof(char) *H*W);
//FILE * fp;
//fopen_s(&fp, "E:\\桌面\\图像处理\\数据\\设计1\\test.raw", "rb");
//fread(gray, sizeof(unsigned char), H*W, fp);
if (!m_Img.IsValid())
{
AfxMessageBox(_T("请先打开图像"));
return;
}
int W = m_Img.GetWidth();
int H = m_Img.GetHeight();
AfxMessageBox(_T("已完成图像priwitt"));
//定义模板
int tw = 3, th = 3;
int temp1[9] = { -1,0,1,-2,0,2,-1,0,1 }, temp2[9] = { -1,-2,-1,0,0,0,1,2,1 };
//定义一些中间变量
int i, j, k, l;
//定义结果图像
unsigned char *gray_result;
gray_result = (unsigned char*)malloc(sizeof(char)*Height*Width);
for (i = 0; i < Height*Width; i )
{
gray_result[i] = 255;
}
for (i = th / 2; i < (H - th / 2); i )
for (j = tw / 2; j < (W - tw / 2); j )
{
//将模板覆在图像上,对应相乘
int counter1 = 0, counter2 = 0, counter = 0;
for (k = 0; k < th; k )
for (l= 0; l < tw; l )
{
counter1 = (gray[W*(i k - th / 2) j l - tw / 2] * temp1[k*tw l]);
counter2 = (gray[W*(i k - th / 2) j l - tw / 2] * temp2[k*tw l]);
}
counter = abs(counter1) abs(counter2);
//通过对模板计算得到的结果与阈值100的比较,大于的为边缘(255),小于的为背景(0)
if (counter > 100)
gray_result[i*W j] = 0;
else
gray_result[i*W j] = 255;
}
m_Result_Img.CreateFromArray(gray_result, W, H, 8, W, 0);
//保存结果图像.
//FILE * pfile;
//fopen_s(&pfile,"E:\\桌面\\图像处理\\数据\\设计1\\test232.raw","wb");
//fwrite(gray_result, 1, H*W, pfile);
//fclose(fp);
//fclose(pfile);
}
void C图像处理Doc::OnRhLaplacian()
{
// TODO: 在此添加命令处理程序代码
//将图像中的灰度值读入数组中
//unsigned char *gray;
//gray = (unsigned char *)malloc(sizeof(char) *H*W);
//FILE * fp;
//fopen_s(&fp, "E:\\桌面\\图像处理\\数据\\设计1\\test.raw", "rb");
//fread(gray, sizeof(unsigned char), H*W, fp);
if (!m_Img.IsValid())
{
AfxMessageBox(_T("请先打开图像"));
return;
}
int W = m_Img.GetWidth();
int H = m_Img.GetHeight();
AfxMessageBox(_T("已完成图像Laplacian"));
//定义模板
int tw = 3, th = 3;
int temp[9] = { 0,1,0,1,-4,1,0,1,0 };
//定义一些中间变量
int i, j, k, l;
//定义结果图像
unsigned char *gray_result;
gray_result = (unsigned char*)malloc(sizeof(char)*Height*Width);
for (i = 0; i < Height*Width; i )
{
gray_result[i] = 255;
}
for (i = th / 2; i < (H - th / 2); i )
for (j = tw / 2; j < (W - tw / 2); j )
{
//将模板覆在图像上,对应相乘
int counter = 0;
for (k = 0; k < th; k )
for (l = 0; l < tw; l )
{
counter = (gray[W*(i k - th / 2) j l - tw / 2] * temp[k*tw l]);
}
counter = abs(counter);
//通过对模板计算得到的结果与阈值100的比较,大于的为边缘(255),小于的为背景(0)
if (counter < 1)
gray_result[i*W j] = 0;
else
gray_result[i*W j] = 255;
}
m_Result_Img.CreateFromArray(gray_result, W, H, 8, W, 0);
//保存结果图像.
//FILE * pfile;
//fopen_s(&pfile,"E:\\桌面\\图像处理\\数据\\设计1\\test232.raw","wb");
//fwrite(gray_result, 1, H*W, pfile);
//fclose(fp);
//fclose(pfile);
}
.
├── MFCApplication1
│ ├── CxImage
│ │ ├── cximagecrtd.dll
│ │ ├── include
│ │ │ ├── stdint.h
│ │ │ ├── xfile.h
│ │ │ ├── ximabmp.h
│ │ │ ├── ximacfg.h
│ │ │ ├── ximadef.h
│ │ │ ├── ximage.h
│ │ │ ├── ximagif.h
│ │ │ ├── ximaico.h
│ │ │ ├── ximaiter.h
│ │ │ ├── ximajas.h
│ │ │ ├── ximajbg.h
│ │ │ ├── ximajpg.h
│ │ │ ├── ximamng.h
│ │ │ ├── ximapcx.h
│ │ │ ├── ximapng.h
│ │ │ ├── ximapsd.h
│ │ │ ├── ximaraw.h
│ │ │ ├── ximaska.h
│ │ │ ├── ximatga.h
│ │ │ ├── ximath.h
│ │ │ ├── ximatif.h
│ │ │ ├── ximawbmp.h
│ │ │ ├── ximawmf.h
│ │ │ ├── xiofile.h
│ │ │ └── xmemfile.h
│ │ └── lib
│ │ ├── debuglib
│ │ │ ├── cximage.lib
│ │ │ ├── jasper.lib
│ │ │ ├── jbig.lib
│ │ │ ├── jpeg.lib
│ │ │ ├── libdcr.lib
│ │ │ ├── libpsd.lib
│ │ │ ├── mng.lib
│ │ │ ├── png.lib
│ │ │ ├── tiff.lib
│ │ │ └── zlib.lib
│ │ └── releaselib
│ │ ├── cximage.lib
│ │ ├── demo.lib
│ │ ├── demodll.lib
│ │ ├── jasper.lib
│ │ ├── jbig.lib
│ │ ├── jpeg.lib
│ │ ├── libdcr.lib
│ │ ├── libpsd.lib
│ │ ├── mng.lib
│ │ ├── png.lib
│ │ ├── tiff.lib
│ │ └── zlib.lib
│ ├── Debug
│ │ ├── MFCApplication1.exe
│ │ ├── MFCApplication1.exp
│ │ ├── MFCApplication1.ilk
│ │ ├── MFCApplication1.lib
│ │ ├── MFCApplication1.pdb
│ │ └── cximagecrtd.dll
│ ├── MFCApplication1
│ │ ├── Debug
│ │ │ ├── MFCApplication1.log
│ │ │ ├── MFCApplication1.obj
│ │ │ ├── MFCApplication1.pch
│ │ │ ├── MFCApplication1.res
│ │ │ ├── MFCApplication1.tlog
│ │ │ │ ├── CL.command.1.tlog
│ │ │ │ ├── CL.read.1.tlog
│ │ │ │ ├── CL.write.1.tlog
│ │ │ │ ├── MFCApplication1.lastbuildstate
│ │ │ │ ├── MFCApplication1.write.1u.tlog
│ │ │ │ ├── link.command.1.tlog
│ │ │ │ ├── link.read.1.tlog
│ │ │ │ ├── link.write.1.tlog
│ │ │ │ ├── rc.command.1.tlog
│ │ │ │ ├── rc.read.1.tlog
│ │ │ │ └── rc.write.1.tlog
│ │ │ ├── MFCApplication1Doc.obj
│ │ │ ├── MFCApplication1View.obj
│ │ │ ├── MainFrm.obj
│ │ │ ├── pch.obj
│ │ │ ├── vc141.idb
│ │ │ └── vc141.pdb
│ │ ├── MFCApplication1.aps
│ │ ├── MFCApplication1.cpp
│ │ ├── MFCApplication1.h
│ │ ├── MFCApplication1.rc
│ │ ├── MFCApplication1.vcxproj
│ │ ├── MFCApplication1.vcxproj.filters
│ │ ├── MFCApplication1.vcxproj.user
│ │ ├── MFCApplication1Doc.cpp
│ │ ├── MFCApplication1Doc.h
│ │ ├── MFCApplication1View.cpp
│ │ ├── MFCApplication1View.h
│ │ ├── MainFrm.cpp
│ │ ├── MainFrm.h
│ │ ├── framework.h
│ │ ├── pch.cpp
│ │ ├── pch.h
│ │ ├── res
│ │ │ ├── MFCApplication1.ico
│ │ │ ├── MFCApplication1.rc2
│ │ │ ├── MFCApplication1Doc.ico
│ │ │ └── Toolbar.bmp
│ │ ├── resource.h
│ │ └── targetver.h
│ ├── MFCApplication1.sln
│ └── 数据
│ ├── 设计1
│ │ ├── blood.bmp
│ │ ├── noise.bmp
│ │ ├── resvvs。raw.bmp
│ │ ├── test.bmp
│ │ ├── test.raw
│ │ ├── test11.raw
│ │ └── test12.raw
│ └── 设计2
│ ├── car.JPG
│ └── 模板
│ ├── 0.jpg
│ ├── 1.jpg
│ ├── 2.jpg
│ ├── 3.jpg
│ ├── 4.jpg
│ ├── 5.jpg
│ ├── 6.jpg
│ ├── 7.jpg
│ ├── 8.jpg
│ ├── 9.jpg
│ ├── A.jpg
│ ├── B.jpg
│ ├── C.jpg
│ ├── D.jpg
│ ├── E.jpg
│ ├── F.jpg
│ ├── G.jpg
│ ├── H.jpg
│ ├── I.jpg
│ ├── J.jpg
│ ├── K.jpg
│ ├── L.jpg
│ ├── M.jpg
│ ├── N.jpg
│ ├── O.jpg
│ ├── P.jpg
│ ├── Q.jpg
│ ├── R.jpg
│ ├── S.jpg
│ ├── T.jpg
│ ├── U.jpg
│ ├── V.jpg
│ ├── W.jpg
│ ├── X.jpg
│ ├── Y.jpg
│ ├── Z.jpg
│ ├── 苏.jpg
│ ├── 豫.jpg
│ ├── 陕.jpg
│ └── 鲁.jpg
└── 找例子网_MFCApplication1-图像处理基础框架及典型算法实现程序设计.zip
15 directories, 147 files
评论