裁剪位图文件--根据给的目标中心坐标从源图像中裁剪一块区域大小固定的图像,病存储

wk119911 2011-04-02 09:44:02
BOOL CHVDlgSaveDlg::SaveBMPFile(LPCSTR lpFileName, BITMAPINFO *pBmpInfo, BYTE *pImageBuffer)
{
int nLineBytes=1628*3;
BOOL bRVal = TRUE;
DWORD dwBytesRead = 0;
DWORD dwSize = 0;
BITMAPFILEHEADER bfh = {0};
int nTable = 0;
DWORD dwImageSize = 0;

if (pBmpInfo->bmiHeader.biBitCount > 8)
{
nTable = 0;
}
else
{
nTable = 256;
}

dwImageSize = WIDTH_BYTES(460 * pBmpInfo->bmiHeader.biBitCount) * 360;


if (dwImageSize <= 0)
{
bRVal = FALSE;
}
else{
bfh.bfType = (WORD)'M' << 8 | 'B';
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nTable * sizeof(RGBQUAD);
bfh.bfSize = bfh.bfOffBits + dwImageSize;

for (int y=0; y<1628;y++)
{
for (int x=0;x<1236;x++)
{

if((x>=nx-230&&x<=nx+230)&&(y>=ny-180&&y<=ny+180))
{


*frameforcut=*(pImageBuffer+ bfh.bfOffBits+ nLineBytes*y+x*3);
frameforcut++;

*frameforcut=*(pImageBuffer+ bfh.bfOffBits+ nLineBytes*y+x*3+1);
frameforcut++;

*frameforcut=*(pImageBuffer+ bfh.bfOffBits +nLineBytes*y+x*3+2);
frameforcut++;
}
}
}

if(nx>230&&nx<1628-230)
{
frameforcut = frameforcut-460*3*360;//指针移到图像开始的地方

}

HANDLE hFile = ::CreateFile(lpFileName,
GENERIC_WRITE ,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);

if (hFile == INVALID_HANDLE_VALUE)
{
bRVal = FALSE;
}
else{
dwSize = sizeof(BITMAPFILEHEADER);
::WriteFile(hFile, &bfh, dwSize, &dwBytesRead, NULL );

dwSize = sizeof(BITMAPINFOHEADER) + nTable * sizeof(RGBQUAD);
::WriteFile(hFile, pBmpInfo, dwSize, &dwBytesRead, NULL );

dwSize = dwImageSize;
WriteFile(hFile, frameforcut, dwSize, &dwBytesRead, NULL );

CloseHandle(hFile);
}
}

return bRVal;
}
...全文
229 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wk119911 2011-04-06
  • 打赏
  • 举报
回复
修改后的代码:BOOL CHVDlgSaveDlg::SaveBMPFile(LPCSTR lpFileName, BYTE *pImageBuffer)
{

int nLineBytes=1628*3;
BOOL bRVal = TRUE;
DWORD dwBytesRead = 0;
DWORD dwSize = 0;
BITMAPFILEHEADER bfh = {0};
int nTable = 0;
DWORD dwImageSize = 0;

if((nx>=230&&nx<1628-230)&&(ny>=180&&ny<1236-180))
{


for (int y=0; y<1236;y++)
{
for (int x=0;x<1628*3;x++)
{

if( ((x>=nx-230)&&(x<nx+230))&&((y>=ny-180)&&(y<ny+180)))
{

*frameforcut=*(pImageBuffer+ nLineBytes*y+x*3);
frameforcut++;

*frameforcut=*(pImageBuffer+ nLineBytes*y+x*3+1);
frameforcut++;

*frameforcut=*(pImageBuffer+nLineBytes*y+x*3+2);
frameforcut++;

}
}
}


frameforcut = frameforcut-460*3*360 ; //指针移到图像开始的地方

}

dwImageSize = WIDTH_BYTES(460 * 24) * 360;
if (dwImageSize <= 0)
{
bRVal = FALSE;
}
else
{
bfh.bfType = (WORD)'M' << 8 | 'B';
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nTable * sizeof(RGBQUAD);
bfh.bfSize = bfh.bfOffBits + dwImageSize;
bfh.bfReserved1 = 0 ;
bfh.bfReserved2 = 0 ;
}

//******************************************************
BITMAPINFOHEADER pBmpInfo;
pBmpInfo.biBitCount = 24;/* 每个像素的位数,如256色,8bit */
pBmpInfo.biClrImportant = 0 ;
pBmpInfo.biClrUsed = 0 ;
pBmpInfo.biCompression = BI_RGB;
pBmpInfo.biPlanes = 1 ;
pBmpInfo.biSizeImage = 360*460*3;
pBmpInfo.biXPelsPerMeter = 0;
pBmpInfo.biYPelsPerMeter = 0;
pBmpInfo.biHeight = 360 ;
pBmpInfo.biWidth = 460 ;
pBmpInfo.biSize = 40 ;

//***********************************************************

HANDLE hFile = ::CreateFile(lpFileName,
GENERIC_WRITE ,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);

if (hFile == INVALID_HANDLE_VALUE)
{
bRVal = FALSE;
}
else
{
dwSize = sizeof(BITMAPFILEHEADER);
::WriteFile(hFile, &bfh, dwSize, &dwBytesRead, NULL );

dwSize = sizeof(BITMAPINFOHEADER) + nTable * sizeof(RGBQUAD);
::WriteFile(hFile, &pBmpInfo, dwSize, &dwBytesRead, NULL );

dwSize = dwImageSize;

WriteFile( hFile, frameforcut, dwSize, &dwBytesRead, NULL );


CloseHandle(hFile);

}
delete [] pImageBuffer ;
// delete [] frameforcut ;
return bRVal ;
}

问题还是没有解决
wk119911 2011-04-06
  • 打赏
  • 举报
回复
好用啊,谢谢
向立天 2011-04-06
  • 打赏
  • 举报
回复
你的代码如果不进行裁剪是好用的么
wk119911 2011-04-06
  • 打赏
  • 举报
回复
怎么没有回复啊
wk119911 2011-04-06
  • 打赏
  • 举报
回复
谢谢楼上两位
一名程序员 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xianglitian 的回复:]
我觉得你可以这样
你可以在内存中把要裁剪下来的东西复制到一个dc中
然后将这个dc中的数据保存下来
[/Quote]这是一种简便的方法,在dc复制中指定复制区域大小和左上角坐标。
向立天 2011-04-06
  • 打赏
  • 举报
回复
我觉得你可以这样
你可以在内存中把要裁剪下来的东西复制到一个dc中
然后将这个dc中的数据保存下来
wk119911 2011-04-02
  • 打赏
  • 举报
回复
补充一下:源图像大小为1628*1236 ,目标图像为460*360,目标中心是通过全局变量nx ,ny传进来的,大家帮忙看一下,这个程序写出的位图文件没有图像信息。

谢谢大家,不胜感激!
wk119911 2011-04-02
  • 打赏
  • 举报
回复
补充:指针frameforcut 常在运行中跑飞
Microsoft Windows GDI+是为C/C++开发者提供的一个基于类的应用程序编程接口(API)。它使得程序可以同时在视频显示器和打印机上使用图形和格式化文本。基于Microsoft Win32的应用程序不能直接访问图形硬件,而是通过GDI+来协调设备驱动和程序动作的交互。GDI+同样支持Microsoft Win64。 适用范围 GDI适用于所有的Window应用程序。GDI+是包含于Windows XP和Windows Server 2003的一项新技术。运行于Microsoft Windows NT 4.0 SP6、Windows 2000、Windows 98 和 Windows Me操作系统的应用程序在分发的时候需要包含GDI+。 适用读者 GDI+ C++ 基类接口是为C/C++开发者所设计。需要精通Windows图形用户接口和消息驱动机制。 目录 序言 - 4 - 目标. - 4 - 适用范围 - 4 - 适用读者 - 4 - 运行环境 - 4 - 文档组织 - 4 - 相关主题 - 4 - GDI+的安全考虑 - 6 - 检验构造函数调用成功与否 - 6 - 分配缓冲区 - 6 - 错误校验 - 7 - 线程同步 - 9 - 相关主题 - 10 - 关于GDI+ - 11 - GDI+ 介绍 - 11 - GDI+ 概览. - 11 - GDI+ 的三个组成部分 . - 11 - 基于类的接口架构 - 12 - GDI+提供了哪些新东西? - 12 - 新特征 - 12 - 编程模式的改变 - 15 - 线条、曲线和图形 - 19 - 矢量图概览 - 19 - 钢笔、线条和矩形 - 20 - 椭圆和弧 - 22 - 多边形 - 22 - 基数样条 - 23 - 贝塞尔样条 - 24 - 路径 - 25 - 画刷和填充图形 - 27 - 开放与闭合曲线 - 29 - 区域 - 30 - 裁剪 - 31 - 路径平直化 - 32 - 线条和曲线的抗锯齿功能 - 32 - 图象、位图和图元文件 - 33 - 位图类型 - 34 - 图元文件 - 37 - 绘制、定位和复制图片 - 39 - 裁剪和缩放图象 - 40 - 坐标系统和转换 - 42 - 坐标系统类型 - 42 - - 2 - 以矩阵来表示转换 - 44 - 全局和局部转换 - 48 - 图形容器 - 51 - 使用GDI+ - 56 - 使用入门 - 56 - 绘制线条 - 56 - 绘制字符串 - 58 - 使用钢笔绘制线条和形状 - 59 - 使用钢笔绘制线条和矩形 - 59 - 设置钢笔的宽度和对齐方式 - 60 - 绘制具有线帽的线条 - 61 - 联接线条 - 62 - 绘制自定义虚线 - 62 - 绘制用纹理填充的线条 - 63 - 使用画笔填充形状 - 63 - 用纯色填充形状 - 64 - 用阴影图案填充形状 - 64 - 用图像纹理填充形状 - 64 - 在形状平铺图像 - 65 - 用渐变色填充形状 - 68 - 使用图像、位图和图元文件 - 68 - 加载和显示位图 - 68 - 加载和显示图元文件 - 69 - 记录图元文件 - 69 - 剪裁和缩放图像 - 71 - 旋转、反射和扭曲图像 - 72 - 缩放时使用插值模式控制图像质量 - 73 - 创建缩略图像 - 75 - 采用高速缓存位图来提高性能 - 76 - 通过避免自动缩放改善性能 - 76 - 读取图像元数据 - 77 - 使用图像编码器和解码器 - 83 - 列出已安装的编码器 - 83 - 列出已安装的解码器 - 84 - 获取解码器的类标识符 - 86 - 获取编码器的参数列表 - 88 - 将BMP图像转换为PNG图像 . - 100 - 设定JPEG的压缩等级 - 101 - 对JPEG图像进行无损变换 - 102 - 创建和保存多帧图像 - 105 - 从多帧图像复制单帧 - 107 - Alpha 混合线条和填充 - 109 - 绘制不透明和半透明的线条 - 109 - 用不透明和半透明的画笔绘制 - 110 - - 3 - 使用复合模式控制 Alpha 混合 . - 111 - 使用颜色矩阵设置图像的 Alpha 值 . - 112 - 设置单个象素的alpha值 . - 114 - 使用字体和文本 - 115 - 构造字体系列和字体 - 115 - 绘制文本 - 116 - 格式化文本 - 117 - 枚举已安装的字体 - 120 - 创建专用的字体集合 - 122 - 获取字体规格 - 126 - 对文本使用消除锯齿效果 - 130 - 构造并绘制曲线 - 131 - 绘制基数样条曲线 - 131 - 绘制贝塞尔样条 - 133 - 用渐变画刷填充形状 - 134 - 创建线性渐变 - 134 - 创建路径渐变 - 137 - 将 Gamma 校正应用于渐变 - 144 - 构造并绘制路径 - 145 - 使用线条、曲线和形状创建图形 - 145 - 填充开放式图形 - 147 - 使用图形容器 - 147 - 管理 Graphics 对象的状态 - 148 - 使用嵌套的 Graphics 容器 - 151 - 变换. - 154 - 使用世界变换 - 154 - 为什么变换顺序非常重要 - 155 - 使用区域 - 156 - 对区域使用点击检测 - 156 - 对区域使用剪辑 - 157 - 对图像重新着色 - 158 - 使用颜色矩阵对单色进行变换 - 158 - 转换图像颜色 - 160 - 缩放颜色 - 161 - 旋转颜色 - 164 - 剪取颜色 - 166 - 使用颜色重映射表 - 168 - 打印. - 169 - 将GDI+输出至打印机 - 169 - 显示一个打印对话框 - 172 - 通过提供打印机句柄优化打印 - 173 - 附录:GDI+ 参考 - 176 -
使用MFC在VS2013编写的数字图象处理软件,能够实现相当强大的功能。 BMP格式读取 保存 DFT FFT 直方图 色调均化 缩放 模糊 锐化 滤镜 形态学处理 曲线 裁剪 灰度图 彩色图 自动阈值 等等...除此之外还有很多其他小功能... 建议使用VS2013打开!!!核心代码在Bmp.cpp!!! 更新文档: 2014年6月18日更新说明: 这次应该是上交的最后一次作业了,在今日的展示结束之后总体情况还好,但是发现了几个问题。 首先是这个程序是在win8环境下设计的,所以程序的一些大小参数以及按钮图片的位置参数是适合在win8的环境下操作,在设计报告使用的操作系统也是win8。 而如果将该程序移动至win7系统上操作的话可以在大小与位置上会出现一些偏差,所以推荐将该程序在win8系统下运行,如果没有win8系统但是想重装的话可以找我。 然后本次更新的内容就是对设计报告的要求的一些补充,比如图片的裁剪功能,还有一些照旧的BUG修复了。 关于这个裁剪功能,在程序图像裁剪有一个说明按钮,在设计报告有提到怎么使用的,所以在这里就不一一说明了,其实就跟在PS上用裁剪差不多,很容易用的。 关于设计的感想也写在了设计报告上了- -,这里也就不多说了。 好了这个程序算是最终完成了,撒花!师姐辛苦了~!!!!! ================================================================================================================================================================ 2014年5月13日更新说明: 这次的更新比较少,主要就是自动阈值分割图像方面的更新。 实现该操作的函数依然放在Bmp.cpp里面,里面一共使用了三种方式来决定自动阈值。 其一种是“大津法”,函数是“OtsuThreshold”,该函数最后会返回一个阈值,该阈值就是大津法得出的阈值,具体实现方式可以在cpp文件查看。 还有一种方法就是“迭代法”,函数是“IterationThreshold”,该函数最后会返回一个阈值,该阈值就是迭代法得出的阈值,具体实现方式可以在cpp文件查看。 前两种方法的实现方法都如老师在PPT上所说的一样,而且运算起来非常快,基本可以说是瞬时得出。 而第三种方法是我自己写的一个方法,叫做“对半分”法,函数是“HalfCutThreshold”,该函数最后会返回一个阈值,该阈值就是对半分得出的阈值,具体实现方式可以在cpp文件查看。 其原理就是计算出一个阈值,使到阈值处理后图片的黑色像素与白色像素的数量相等或者最接近,也就是把图片按黑白像素对半分的方法来对图像进行分割。 关于程序的使用方法,可以在鼠标右键菜单选择“调整”->“阈值”->“高级阈值”来打开高级阈值处理的对话框。 打开对话框后,默认为最直接的自己首选阈值的方法,可以通过鼠标的左键拖动直方图的绿色竖线来调整需要设定的阈值大小,同时右边会有该图片的预览,可以很方便操作。 如果需要使用自动阈值分割,可以在阈值方式更改,一旦选择了“直接阈值”以外的阈值方式,程序便会自动用所选择的方法帮你计算出一个阈值,同时在直方图上会显示出该阈值的位置,还有该阈值的大小,同时预览图片也会立即更新。 值得注意的是,当你选择了自动阈值的时候,你不能再通过鼠标左键在直方图上手动调整阈值大小了哦,这个时候你只需要将阈值方式调回“直接阈值”即可重新自己调整! 除了有关作业的更新之外,这次更新还调整了图片备份的内存优化,加上了使用磁盘作为备份的空间,不过这些作为使用者的话是不需要怎么注意的嗯嗯,尽情使用即可! 最后,再次谢谢师姐能够读完这个文档,如果还有什么问题的话就联系我吧,联系方式就在软件了欢迎点击- -,谢谢! ================================================================================================================================================================ 2014年5月6日更新说明: 这次的主要更新是形态学处理的部分,也就是膨胀、腐蚀、开与闭操作。 实现函数依然是放在Bmp.cpp这个文件里面。名字为Morphology的函数就是该形态学操作的函数。 可以通过在函数调入不同的参数与设置使到一个函数同时实现膨胀与腐蚀的功能,而开与闭的功能只需要连续调用两次函数,并且参数不同就行了,使用非常简单。 然后就是软件的使用部分,软件的位置依然是放在Release文件夹里面,而形态学处理的按钮在“右键-调整-形态学处理-形态学运算”,单击后就会出现形态学运算的对话框。 在对话框会看到一个9*9的结构元素方阵,可以通过使用鼠标左键点击来改变结构元素的形状,双击鼠标为还原结构元素。 设定好结构元素后可以选择操作的四种方式,选择后便会得到处理后的图像了,十分方便。 当然,如果你的图片是彩色的,这个处理也是支持的,因为我的实现函数把“与”操作改为“取最小值”,“或”操作改为“取最大值”,这个改动在对于二值图像的处理是一样效果的,但是也使到形态学处理适用于彩色图像了。 如果你想把彩色图片或者灰度图片二值化后在进行形态学处理,可以勾选对话框的“二值化”选项。 值得一提的是,这个二值化是对每一层的颜色单独二值化,如果想要实现阈值效果,可以直接使用阈值功能或者转化为灰度图之后再使用对话框内的二值化,效果是一样的。 除此之外还有一个边缘提取功能,就是形态学处理的边缘提取,实现方式就是像PPT那样操作了,这里不详细说明了,是个很简单的按钮。 在作业之外的更新有比较多,增加了“马赛克”功能(在“滤镜”),可以很方便地对整张图片进行打码操作,至于局部打码操作可能会在之后的更新实现,请耐心等候。 然后还更换了鼠标图案,使大家更容易知道鼠标是否已经处于图片区域,鼠标图案是片很漂亮的叶子哦(出自KEY的AIR)。 这次更新还增加了瞬时更新鼠标所指像素点的RGB颜色值,横纵坐标,还有当前鼠标所指的颜色的显示。 在之前的版本,如果想要获得鼠标所指的像素点的像素信息,只能通过鼠标的右键点击,这样有时候会不太方便,而现在的话在主界面就已经可以瞬时看到了,而且清晰明了简单易用。 然后还修复了模糊与值函数的内存泄漏BUG,相信之后还会有更多的BUG等着来修复- -。 然后本次最大的更新就是!!!本软件支持Jpg格式了!师姐可以试下用这个软件打嘅Jpg格式的图片哦!这个更新简直太人性化了,以后做图像处理终于不用每次都要打开PS把Jpg转换为Bmp再操作了! 最后,再次谢谢师姐能够读完这个文档,如果还有什么问题的话就联系我吧,联系方式就在软件了欢迎点击- -,谢谢! ================================================================================================================================================================ 2014年4月8日更新说明: 这次更新的是DTF跟FFT这两个功能,DFT的函数在Bmp.cpp的DFT里面,在里面已经加上了注释了。 而FFT在fft12_ifft12.cpp这个文件里面,文件包括了一维FFT和二维FFT的函数,当然IFFT也是存在的。 关于DFT的部分,由于我在DFT的算法里面使用了Complex类与COMPLEX结构体(类包含了运算符的重载与一些常用函数),毕竟C语言并没有专用的复数运算可以调用。 所以在进行DFT运算时会不断调用类的构造函数与析构函数,这导致了进行DFT运算使用的时间比Matlab写出来的要慢很多。 虽然处理起来时间比较长,但是相比FFT的优势是可以对非2的幂数的大小的图片进行傅里叶变换,而非2幂数的FFT的话如果进行补0再运算的话会导致算出的频域是错误的频域(毕竟随意加0会直接影响到这个图片)。 然后为了加快DFT的运算,这里我使用的方法是将复数因子(e的多少次方的那个)分成横向与纵向的乘积,先算出w_h0跟w_w0,之后的其他任何一个因子其实都是他们的幂相乘。 利用这个方法先把因子算好,这样就不用在每一步都计算sin跟cos的值,使到时间变快了很多。 虽然如此,计算一幅256*256的图使用I5CPU都得需要10秒钟,所以这种算法只能将着用,因此我也懒得写IDFT了- -。 所以为了偷懒我的IDFT直接调用了IFFT的函数,也就是说,对于不是2的幂数的图片,你可以进行DFT,但是不能变回来- -。 关于FFT的部分,其速度比Matlab的FFT算法快了不是一般的多,所以在之后的滤波处理都使用了FFT。 但是FFT的缺点是在进行FFT运算前你必须要把图片大小转成2的幂数(我的软件自带缩放哦~),当然不一定要宽高相等,256*1024也是可以的。 关于这一点我在以后可能会使用因子法来进行FFT而不用现在的radio2法,这样的话可以对非2幂数的图片进行FFT了。 不过由于时间关系,现在的程序依然只能对2的幂数的大小进行FFT,这个非常抱歉。 关于幅值与角度的显示,在FFT滤波选项可以查看到,当然查看角度的图片并没有什么意义就是了- -。 然后无论是8位图,24位图还是32位图,DFT跟DDT都完美支持! 然后就是那个FFT滤波的对话框,这里只写出了一个雏形(毕竟这几天清明节没有时间去写,求原谅- -),其实只能看看有什么功能而已,实现的函数其实还没有写的- -。 不过这次的作业并没有要求需要写FFT之后的滤波,所以也不算没有完成作业? 最后,无论是DFT还是FFT全都是自己一个代码一个代码写上去- -,研究傅里叶变换还把信号与系统的书都拿出来了,所以这次的作业真的好辛苦啊! 所以虽然功能尚未完善,但是请体谅!最后,再次谢谢师姐能够读完这个文档,如果还有什么问题的话就联系我吧,谢谢!(为了防止联系不到我,程序里面已经加入了“联系我”按钮了~) ================================================================================================================================================================ 2014年3月31日更新说明: 鉴于上个版本的软件功能还没有完整,而且内存存在泄漏的BUG会导致长时间使用时消耗内存过大。 所以这个版本将完善了很多功能,以及优化了内存问题,基本可以实现长时间使用了嗯嗯~撒花~~~~ 首先,程序的基本操作没有变化,基本都是右键操作,这次增加了重新读取图片功能,可以很方便地对图片进行还原处理。 然后,这次的作业是直方图与滤波器的操作,这些操作可以在直方图的选项与滤波器的选项选择。 【色调均化】直方图的操作包括色调均化(我用了半天时间终于把PS的色调均化搞懂了,原来PS的色调均化根本不需要转什么色彩空间哦!),色调均化采用的是PS的算法。 【直方图调整】除了色调均化外还有查看直方图功能,该功能可以查看图片各个颜色的直方图以及总颜色(RGB)的直方图,还可以对直方图进行拉伸变换以提高图片的对比度,具体操作只需要用鼠标在直方图上使用左键或右键移动即可。 【曲线】除此之外,还可以对直方图进行函数变化(曲线),我尽量模拟出了PS的曲线效果,但是技术有限- -,这里的曲线只允许一种颜色的函数出现10个折点,合计一共可以出现40个折点,但是基本觉得是够用得了,使用方法依然是很简单,用鼠标点击曲线某一点即可添加或者取消折点。 【平均】这次的作业还有一个就是滤波器的操作,同样在右键菜单可以选择平均滤波的使用,具体用法很简单,这里就不说明了。 【值】值滤波和平均滤波的操作差不多,也不一一说明了。 【锐化】个人觉得除了拉普拉斯的锐化方式之外的锐化都很难看所以就只保留了这两种锐化方式了,将就着用把- -。 【自定义滤波器】为了能够灵活地使用滤波器,一个自定义滤波器的功能还是需要的,具体的功能就跟PS的差不多吧,不过这个功能有个缺点就是当你需要输入负数时,你需要先输入数字再在前面输入负号- -,输入分数时小数点必须快速输入(我设置了一个不太快的刷新- -),虽然现在已经找到解决办法,但是懒得改了就将就着用吧- -。 在实现函数方面,还是在Bmp.cpp与其头文件,为了让师姐能够容易地找到各个函数的所在,我已经在函数的定义前加上它的文功能了,相信应该很容易找到。 至于函数过程的注释,由于老师没有要求在作业需要写出来,同时函数太多也不好写,所以就算了- -,其实算法部分的话要读懂并不那么困难的。 为了方便,我在这里还是把这次作业所需要的函数列出来把(全部函数都在Bmp.cpp): void Bmp::SmoothAverage(int x,int y)//平均滤波 void Bmp::SmoothMedian(int x,int y)//值滤波 void Bmp::FilterDefine(double filter[5][5],int divide,int move)//自定义滤波器 void Bmp::CurveFunction(int color,int curve[256])//实现图片的函数变换,就是曲线啦 int** Bmp::GetHistogram()//计算图片的直方图,非归一化直方图 void Bmp::HistogramEqualization()//色调均化,算法采用PS的算法 void Bmp::Histogram(int Color,int Min,int Max)//直方图函数处理,就是直方图拉伸啦 以上就是这次作业的内容啦,为了方便,我还加入了 图像缩放 彩色转灰度 阈值 等功能,基本上这个程序已经越来越完善了,接下来就是慢慢添加功能以及修改细节啦。 最后,再次谢谢师姐能够读完这个文档,如果还有什么问题的话就联系我吧,谢谢! ================================================================================================================================================================ 因为本人的兴趣,我把这次作业做的比较复杂,功能比较多,所以您在找打开保存等函数的时候可能会有点麻烦,所以在这里放一个说明文档。 首先,本程序生成的exe应用程序在Realse目录下,那个有个很漂亮的宝石图标的程序就是了! 打开程序后,您可以使用打开按钮来打开图片,也可以直接把图片用鼠标直接拖入程序打开(个人推荐第二种,毕竟方便)。 这个程序是支持8位图24位图32位图的哦! 打开后可以使用保存按钮保存图片,使用存为文本来保存为文本文档,我的程序会把图片以颜色层数为依据来保存文本文档。 如果您想使用我加入的其他功能,可以对着图片按右键,在弹出的菜单你想要的功能就是了,但是锐化功能还没写(因为时间不够- -),其他的功能可以将就用下。 如果您想要找到这个程序的cpp文件,他在这个文件夹的同名文件夹下(MFC读取显示与保存BMP图像\MFC读取显示与保存BMP图像\Bmp.cpp(.h))。 因为我把与图像有关的操作封装成一个类(C++的),用以与其他的窗口类分来容易编写。 而与本次作业有关的函数有Open(),Save(),SaveAsTxt(),三个,在Bmp.cpp都可以找到,并且都已经注释了,您可以去那里查找观看。 当然除了这些之外,我还写了其他一些函数如反色反转滤波器等,但是没有注释(因为太懒),师姐(兄)有兴趣的话也可以去看看,当然也可以直接去程序那里看效果。 最后如果师姐(兄)有什么看不懂或者找不到函数在哪的话可以联系我帮你找(毕竟我也觉得文件写得有点长而且复杂),我的手机号码是15800037916(666542)。 谢谢师姐(兄)看完!
                《人工智能:深度学习入门到精通实战》课程主要就人工智能领域相关的深度学习基础、深度学习计算、卷积神经网络+经典网络、循环神经网络+RNN进阶、优化算法、计算机视觉和自然语言处理等,配套实战案例与项目全部基于真实数据集与实际任务展开,结合深度学习框架进行建模实战。                由浅入深,每一个理论搭配一个实验,引领学员浸泡式逐步掌握各项技能和实战项目,且侧重技能不同,学员的知识体系会更加全面课程大纲:第一章:深度学习基础-深度学习简介01.1-前置知识01.2-传统编程与数据编程01.3-深度学习起源01.4-深度学习崛起与发展01.5-深度学习成功案例01.6-深度学习特点 第二章:深度学习基础-Python基础02.1-PyTorch介绍与环境配置02.2-数据操作与创建Tensor02.3-算术操作、索引与改变形状02.4-线性代数、广播机制与内存开销02.5-Tensor和NumPy相互转换与Tensor on GPU02.6-实验01-创建和使用Tensor-102.7-实验01-创建和使用Tensor-202.8-梯度下降02.9-实验02-梯度下降-102.10-实验02-梯度下降-202.11-自动求梯度概念02.12-自动求梯度实例02.13-实验03-自动求梯度-102.14-实验03-自动求梯度-2 第三章:深度学习基础-线性回归03.1-线性回归讲解03.2-线性回归实例03.3-实验04-从零实现线性回归-103.4-实验04-从零实现线性回归-203.5-实验05-线性回归的简洁实现-103.6-实验05-线性回归的简洁实现-2 第四章:深度学习基础-softmax回归04.1-softmax回归04.2-实验06-FashionMNIST04.3-实验07-从零实现Softmax回归-104.4-实验07-从零实现Softmax回归-204.5-实验08-softmax回归的简洁实现 第五章:深度学习基础-多层感知机05.1-感知机05.2-多层感知机05.3-多层感知机与神经网络05.4-激活函数05.5-正向传播05.6-反向传播05.7-正向传播和反向传播05.8-批大小05.9-实验09-从零实现MLP05.10-实验10-MLP的简洁实现 第六章:深度学习基础-模型选择、欠拟合和过拟合06.1-训练误差和泛化误差06.2-模型选择06.3-欠拟合和过拟合06.4-权重衰减06.5-丢弃法06.6-实验11-多项式函数拟合实验06.7-实验12-高维线性回归实验-106.8-实验12-高维线性回归实验-206.9-实验13-Dropout 第七章:深度学习基础-数值稳定性和模型初始化07.1-数值稳定性和模型初始化-107.2-数值稳定性和模型初始化-207.3-实验14-房价预测案例-107.4-实验14-房价预测案例-207.5-实验14-房价预测案例-3 第八章:深度学习计算-模型构造08.1-模型构造-108.2-模型构造-208.3-模型构造-308.4-实验15-模型构造-108.5-实验15-模型构造-2 第九章:深度学习计算-模型参数的访问、初始化和共享09.1-模型参数的访问09.2-模型参数初始化和共享09.3-实验16-模型参数-109.4-实验16-模型参数-2 第十章:深度学习计算-自定义层与读取和储存10.1-不含模型参数的自定义层10.2-含模型参数的自定义层10.3-实验17-自定义层10.4-读取和储存10.5-GPU计算10.6-实验18-读取和储存  第十一章:卷积神经网络11.01-卷积神经网络11.02-卷积神经网络的组成层11.03-图像分类的局限性11.04-二维卷积层与卷积层11.05-卷积在图像的直观作用11.06-实验19-二维卷积层11.07-填充与步幅11.08-卷积过程11.09-卷积层参数-111.10-卷积层参数-211.11-实验20-Pad和Stride11.12-多输入和输出通道11.13-实验21-多通道11.14-池化层11.15-实验22-池化层 第十二章:经典网络12.01-卷积神经网络12.02-实验23-LeNet模型12.03-深度卷积神经网络12.04-实验24-AlexNet模型12.05-使用重复元素的网络12.06-实验25-VGG模型12.07-网络的网络12.08-实验26-NiN模型12.09-含并行连接的网络12.10-实验27-GoogLeNet模型12.11-批量归一化-112.12-批量归一化-212.13-实验28-批量归一化12.14-残差网络12.15-实验29-残差网络12.16-稠密连接网络12.17-实验30-稠密连接网络 第十三章:循环神经网络13.01-语言模型和计算13.02-n元语法13.03-RNN和RNNs13.04-标准RNN向前输出流程和语言模型应用13.05-vector-to-sequence结构13.06-实验31-语言模型数据集-113.07-实验31-语言模型数据集-213.08-实验32-从零实现循环神经网络-113.09-实验32-从零实现循环神经网络-213.10-实验32-从零实现循环神经网络-313.11-实验32-从零实现循环神经网络-413.12-实验33-简洁实现循环神经网络-113.13-实验33-简洁实现循环神经网络-2 第十四章:RNN进阶14.01-通过时间反向传播-114.02-通过时间反向传播-214.03-长短期记忆-114.04-长短期记忆-214.05-实验34-长短期记忆网络-114.06-实验34-长短期记忆网络-214.07-门控循环单元14.08-RNN扩展模型14.09-实验35-门控循环单元 第十五章:优化算法15.01-优化与深度学习15.02-局部最小值和鞍点15.03-提高深度学习的泛化能力15.04-实验36-小批量梯度下降-115.05-实验36-小批量梯度下降-215.06-动量法-115.07-动量法-215.08-实验37-动量法15.09-AdaGrad算法与特点15.10-实验38-AdaGrad算法15.11-RMSrop算法15.12-实验39-RMSProp算法15.13-AdaDelta算法15.14-实验40-AdaDelta算法15.15-Adam算法15.16-实验41-Adam算法15.17-不用二阶优化讲解与超参数 第十六章:计算机视觉16.01-图像增广与挑战16.02-翻转、裁剪、变化颜色与叠加16.03-实验42-图像增广-116.04-实验42-图像增广-216.05-微调16.06-迁移学习16.07-实验43-微调-116.08-实验43-微调-216.09-目标检测16.10-边界框16.11-实验44-边界框16.12-锚框与生成多个锚框16.13-交并比16.14-实验45-生成锚框-116.15-实验45-生成锚框-216.17-标注训练集的锚框-116.18-标注训练集的锚框-216.19-实验46-标注训练集的锚框-116.20-实验46-标注训练集的锚框-216.21-实验46-标注训练集的锚框-316.22-输出预测边界框16.23-实验47-输出预测边界框-116.24-实验47-输出预测边界框-216.25-多尺度目标检测16.26-实验48-多尺度目标检测16.27-目标检测算法分类16.28-SSD与模型设计16.29-预测层16.30-损失函数16.31-SSD预测16.32-实验49-目标检测数据集16.33-实验50-SSD目标检测-116.34-实验50-SSD目标检测-216.35-实验50-SSD目标检测-316.36-实验50-SSD目标检测-416.37-实验50-SSD目标检测-516.38-实验50-SSD目标检测-6 第十七章:自然语言处理17.01-词嵌入和词向量17.02-神经网络模型17.03-跳字模型17.04-训练跳字模型17.05-连续词袋模型17.06-负采样17.07-层序softmax17.08-子词嵌入17.09-Fasttext模型17.10-全局向量的词嵌入17.11-实验51-word2vec之数据预处理-117.12-实验51-word2vec之数据预处理-217.13-实验52-word2vec之负采样-117.14-实验52-word2vec之负采样-217.15-实验53-word2vec之模型构建-117.16-实验53-word2vec之模型构建-217.17-实验54-求近义词和类比词-117.18-实验54-求近义词和类比词-217.19-实验55-文本情感分类RNN-117.20-实验55-文本情感分类RNN-217.21-实验55-文本情感分类RNN-317.22-实验55-文本情感分类RNN-417.23-TextCNN17.24-TextCNN流程17.25-实验56-文本情感分类textCNN-117.26-实验56-文本情感分类textCNN-217.27-Seq2Seq的历史与网络架构17.28-Seq2Seq的应用与存在的问题17.29-Attention机制与Bucket机制17.30-实验57-机器翻译之模型构建-117.31-实验57-机器翻译之模型构建-217.32-实验57-机器翻译之模型构建-317.33-实验58-机器翻译之训练评估-117.34-实验58-机器翻译之训练评估-217.35-实验58-机器翻译之训练评估-3
序言 4 目标 4 适用范围 4 适用读者 4 运行环境 4 文档组织 4 相关主题 4 GDI+的安全考虑 6 检验构造函数调用成功与否 6 分配缓冲区 6 错误校验 8 线程同步 9 相关主题 10 关于GDI+ 11 GDI+ 介绍 11 GDI+ 概览 11 GDI+ 的三个组成部分 11 基于类的接口架构 12 GDI+提供了哪些新东西? 12 新特征 12 编程模式的改变 15 线条、曲线和图形 19 矢量图概览 19 钢笔、线条和矩形 20 椭圆和弧 22 多边形 22 基数样条 23 贝塞尔样条 24 路径 25 画刷和填充图形 27 开放与闭合曲线 29 区域 30 裁剪 31 路径平直化 32 线条和曲线的抗锯齿功能 32 图象、位图和图元文件 33 位图类型 34 图元文件 37 绘制、定位和复制图片 39 裁剪和缩放图象 40 坐标系统和转换 42 坐标系统类型 42 以矩阵来表示转换 44 全局和局部转换 48 图形容器 51 使用GDI+ 56 使用入门 56 绘制线条 56 绘制字符串 58 使用钢笔绘制线条和形状 59 使用钢笔绘制线条和矩形 59 设置钢笔的宽度和对齐方式 60 绘制具有线帽的线条 61 联接线条 62 绘制自定义虚线 62 绘制用纹理填充的线条 63 使用画笔填充形状 63 用纯色填充形状 64 用阴影图案填充形状 64 用图像纹理填充形状 64 在形状平铺图像 65 用渐变色填充形状 68 使用图像、位图和图元文件 68 加载和显示位图 68 加载和显示图元文件 69 记录图元文件 69 剪裁和缩放图像 71 旋转、反射和扭曲图像 72 缩放时使用插值模式控制图像质量 73 创建缩略图像 75 采用高速缓存位图来提高性能 76 通过避免自动缩放改善性能 76 读取图像元数据 77 使用图像编码器和解码器 83 列出已安装的编码器 83 列出已安装的解码器 84 获取解码器的类标识符 86 获取编码器的参数列表 88 将BMP图像转换为PNG图像 100 设定JPEG的压缩等级 101 对JPEG图像进行无损变换 102 创建和保存多帧图像 105 从多帧图像复制单帧 107 Alpha 混合线条和填充 109 绘制不透明和半透明的线条 109 用不透明和半透明的画笔绘制 110 使用复合模式控制 Alpha 混合 111 使用颜色矩阵设置图像的 Alpha 值 112 设置单个象素的alpha值 114 使用字体和文本 115 构造字体系列和字体 115 绘制文本 116 格式化文本 117 枚举已安装的字体 120 创建专用的字体集合 122 获取字体规格 126 对文本使用消除锯齿效果 130 构造并绘制曲线 131 绘制基数样条曲线 131 绘制贝塞尔样条 133 用渐变画刷填充形状 134 创建线性渐变 134 创建路径渐变 137 将 Gamma 校正应用于渐变 144 构造并绘制路径 145 使用线条、曲线和形状创建图形 145 填充开放式图形 147 使用图形容器 147 管理 Graphics 对象的状态 148 使用嵌套的 Graphics 容器 151 变换 154 使用世界变换 154 为什么变换顺序非常重要 155 使用区域 156 对区域使用点击检测 156 对区域使用剪辑 157 对图像重新着色 158 使用颜色矩阵对单色进行变换 158 转换图像颜色 160 缩放颜色 161 旋转颜色 164 剪取颜色 166 使用颜色重映射表 168 打印 169 将GDI+输出至打印机 169 显示一个打印对话框 172 通过提供打印机句柄优化打印 173 附录:GDI+ 参考 176
GDI+ SDK参考(翻译版本) 序言 4 目标 4 适用范围 4 适用读者 4 运行环境 4 文档组织 4 相关主题 4 GDI+的安全考虑 6 检验构造函数调用成功与否 6 分配缓冲区 6 错误校验 8 线程同步 9 相关主题 10 关于GDI+ 11 GDI+ 介绍 11 GDI+ 概览 11 GDI+ 的三个组成部分 11 基于类的接口架构 12 GDI+提供了哪些新东西? 12 新特征 12 编程模式的改变 15 线条、曲线和图形 19 矢量图概览 19 钢笔、线条和矩形 20 椭圆和弧 22 多边形 22 基数样条 23 贝塞尔样条 24 路径 25 画刷和填充图形 27 开放与闭合曲线 29 区域 30 裁剪 31 路径平直化 32 线条和曲线的抗锯齿功能 32 图象、位图和图元文件 33 位图类型 34 图元文件 37 绘制、定位和复制图片 39 裁剪和缩放图象 40 坐标系统和转换 42 坐标系统类型 42 以矩阵来表示转换 44 全局和局部转换 48 图形容器 51 使用GDI+ 56 使用入门 56 绘制线条 56 绘制字符串 58 使用钢笔绘制线条和形状 59 使用钢笔绘制线条和矩形 59 设置钢笔的宽度和对齐方式 60 绘制具有线帽的线条 61 联接线条 62 绘制自定义虚线 62 绘制用纹理填充的线条 63 使用画笔填充形状 63 用纯色填充形状 64 用阴影图案填充形状 64 用图像纹理填充形状 64 在形状平铺图像 65 用渐变色填充形状 68 使用图像、位图和图元文件 68 加载和显示位图 68 加载和显示图元文件 69 记录图元文件 69 剪裁和缩放图像 71 旋转、反射和扭曲图像 72 缩放时使用插值模式控制图像质量 73 创建缩略图像 75 采用高速缓存位图来提高性能 76 通过避免自动缩放改善性能 76 读取图像元数据 77 使用图像编码器和解码器 83 列出已安装的编码器 83 列出已安装的解码器 84 获取解码器的类标识符 86 获取编码器的参数列表 88 将BMP图像转换为PNG图像 100 设定JPEG的压缩等级 101 对JPEG图像进行无损变换 102 创建和保存多帧图像 105 从多帧图像复制单帧 107 Alpha 混合线条和填充 109 绘制不透明和半透明的线条 109 用不透明和半透明的画笔绘制 110 使用复合模式控制 Alpha 混合 111 使用颜色矩阵设置图像的 Alpha 值 112 设置单个象素的alpha值 114 使用字体和文本 115 构造字体系列和字体 115 绘制文本 116 格式化文本 117 枚举已安装的字体 120 创建专用的字体集合 122 获取字体规格 126 对文本使用消除锯齿效果 130 构造并绘制曲线 131 绘制基数样条曲线 131 绘制贝塞尔样条 133 用渐变画刷填充形状 134 创建线性渐变 134 创建路径渐变 137 将 Gamma 校正应用于渐变 144 构造并绘制路径 145 使用线条、曲线和形状创建图形 145 填充开放式图形 147 使用图形容器 147 管理 Graphics 对象的状态 148 使用嵌套的 Graphics 容器 151 变换 154 使用世界变换 154 为什么变换顺序非常重要 155 使用区域 156 对区域使用点击检测 156 对区域使用剪辑 157 对图像重新着色 158 使用颜色矩阵对单色进行变换 158 转换图像颜色 160 缩放颜色 161 旋转颜色 164 剪取颜色 166 使用颜色重映射表 168 打印 169 将GDI+输出至打印机 169 显示一个打印对话框 172 通过提供打印机句柄优化打印 173 附录:GDI+ 参考 176

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧