当前位置: 首页 > 编程日记 > 正文

图像预处理第7步:标准归一化

图像预处理第7步:标准归一化
将分割出来的各个不同宽、高的数字字符宽、高统一

//图像预处理第7步:标准归一化
//将分割出来的各个不同宽、高的数字字符宽、高统一
void CChildView::OnImgprcStandarize() 
{StdDIBbyRect(m_hDIB,w_sample,h_sample);//在屏幕上显示位图CDC* pDC=GetDC();DisplayDIB(pDC,m_hDIB);    DrawFrame(pDC,m_hDIB,m_charRect,2,RGB(21,255,25));gyhfinished=true;
}
/******************************************************************
*
*  函数名称:
*      StdDIBbyRect()
*
*  参数:
*     HDIB  hDIB          -图像的句柄
*     int   tarWidth      -标准化的宽度
*     int   tarHeight     -标准化的高度
*
*  返回值:
*         无
*
*  功能:
*     将经过分割的字符,进行缩放处理使他们的宽和高一直,以方便特征的提取
*
*  说明:
*     函数中用到了,每个字符的位置信息,所以必须在执行完分割操作之后才能执行标准化操作
*
******************************************************************/
void StdDIBbyRect(HDIB hDIB, int tarWidth, int tarHeight)
{    //指向图像的指针BYTE* lpDIB=(BYTE*)::GlobalLock ((HGLOBAL)hDIB);//指向象素起始位置的指针BYTE* lpDIBBits=(BYTE*)::FindDIBBits ((char*)lpDIB);//指向象素的指针BYTE* lpSrc;//获取图像的的宽度LONG lWidth=::DIBWidth ((char*)lpDIB);//获取图像的高度LONG lHeight=::DIBHeight ((char*)lpDIB);// 循环变量int    i;int    j;// 图像每行的字节数LONG    lLineBytes = WIDTHBYTES(lWidth * 8);//宽度、高度方向上的缩放因子double wscale,hscale;//开辟一块临时缓存区,来存放变化后的图像信息
    LPSTR lpNewDIBBits;LPSTR lpDst;//缓存区的大小和原图像的数据区大小一样HLOCAL nNewDIBBits=LocalAlloc(LHND,lLineBytes*lHeight);//指向缓存区开始位置的指针lpNewDIBBits=(char*)LocalLock(nNewDIBBits);//指向缓存内信息的指针lpDst=(char*)lpNewDIBBits;//将缓存区的内容赋初始值memset(lpDst,(BYTE)255,lLineBytes*lHeight);//进行映射操作的坐标变量int i_src,j_src;//存放字符位置信息的结构体
    CRect rect;CRect rectnew;//先清空一个新的矩形区域链表以便存储标准化后的矩形区域链表
    m_charRectCopy.clear ();//从头到尾逐个扫描各个结点while(!m_charRect.empty()){//从表头上得到一个矩形rect= m_charRect.front();//从链表头上面删掉一个
        m_charRect.pop_front();//计算缩放因子//横坐标方向的缩放因子wscale=(double)tarWidth/rect.Width ();//纵坐标方向的缩放因子hscale=(double)tarHeight/rect.Height ();//计算标准化矩形//上边界rectnew.top =rect.top ;//下边界rectnew.bottom =rect.top +tarHeight;//左边界rectnew.left =rect.left ;//右边界rectnew.right =rectnew.left +tarWidth;//将原矩形框内的象素映射到新的矩形框内for(i=rectnew.top ;i<rectnew.bottom ;i++){for(j=rectnew.left ;j<rectnew.right ;j++){   //计算映射坐标i_src=rectnew.top +int((i-rectnew.top )/hscale);j_src=rectnew.left +int((j-rectnew.left )/wscale);//将相对应的象素点进行映射操作lpSrc=(unsigned char *)lpDIBBits + lLineBytes *  i_src + j_src;lpDst = (char *)lpNewDIBBits + lLineBytes * i + j;*lpDst=*lpSrc;}}//将标准化后的矩形区域插入新的链表
        m_charRectCopy.push_back (rectnew);}//存储标准化后新的rect区域m_charRect=m_charRectCopy;//将缓存区的内容拷贝到图像的数据区内memcpy(lpDIBBits,lpNewDIBBits,lLineBytes*lHeight);//解除锁定
    ::GlobalUnlock ((HGLOBAL)hDIB);
}

运行效果:

转载于:https://www.cnblogs.com/Bobby0322/p/5408422.html

相关文章:

8. 进制转化的函数

一&#xff0c;表示进制的单词 bin&#xff1a;二进制 oct&#xff1a;八进制 dec&#xff1a;十进制 hex&#xff1a;十六进制二&#xff0c;四种进制的数据表示方式 $bin0b1010; //二进制数字写法&#xff08;暂时不学 &#xff09; …

二叉树广度优先遍历

#include <iostream> using namespace std;struct Node{//二叉树节点int value;Node *left;Node *right; };struct queue{//辅助队列int head;int tail;int len;//队列长度&#xff0c;遍历时用Node ** list;//队列内容void push(Node *n){list[tail] n;len;}Node * pop…

phaser.min.js_如何使用Phaser 3,Express和Socket.IO构建多人纸牌游戏

phaser.min.jsIm a tabletop game developer, and am continually looking for ways to digitize game experiences. In this tutorial, were going to build a multiplayer card game using Phaser 3, Express, and Socket.IO.我是桌面游戏开发人员&#xff0c;并且一直在寻找…

VirtualBox - RTR3InitEx failed with rc=-1912 (rc=-1912)

有一天重启电脑后虚拟机virtual box突然打不开了&#xff0c;提示类似 https://askubuntu.com/questions/900794/virtualbox-rtr3initex-failed-with-rc-1912-rc-1912 参考帖子中查看了一下包的情况dpkg --list virtualbox-* | grep ii 结果&#xff1a;ii virtualbox-dkms …

边工作边刷题:70天一遍leetcode: day 27

Permutation Sequence 原理&#xff1a;一个permutation是n位&#xff0c;在第i位的值取决于有多少个i-1位的组合。这i-1位的组合是在高位pick完之后剩下的数中 细节&#xff1a; 不同于decimal&#xff0c;位数是固定的&#xff0c;所以不能用k>0作为循环条件&#xff08;这…

基本数据结构(图: 基本结构,DFS,prim算法, kruskal算法)

#include <iostream> using namespace std; //约定&#xff1a; //1. 图是由很多节点(VERTEX)构成的, 因此图结构是由一个VERTEX的链表构成的, 每个VERTEX则需要有一个id,也就是start, 取start是为了跟LINE更直观地结合。 //2. 每个节点关联着很多(LINE)构成,因此每个VER…

gatsby_如何使用Gatsby和Leaflet创建夏季公路旅行地图绘制应用程序

gatsbyGet ready for the summer by building your own road trip mapping app with this step-by-step guide!通过此逐步指南&#xff0c;构建自己的公路旅行地图应用&#xff0c;为夏天做好准备&#xff01; What are we going to build? 我们要建造什么&#xff1f; What …

NEFU 1146 又见A+B

又见ab Problem:1146 Time Limit:1000ms Memory Limit:65535K Description 给定两个非负整数A,B,求他们的和。 Input 多组输入&#xff0c;每组输入两个非负整数A和B&#xff08;0<A,B<10^3000&#xff09;&#xff0c;可能会有前缀0&#xff0c;但保证总长度不超过3000…

图的最短路径dijkstra算法

想法是这样的&#xff1a; 1. 最开始要建立4个list&#xff0c;分别存储 a. 所有的Vertex: allVertex[] b. 一个空的Vertex list: emptyVertex[] c. 一个前缀表 previous list(用来回溯路径用): previous[] d. 一个表示最短距离的表(就是表示某个点与0点的最短距离)&#xff1…

JDBC数据源连接池(1)---DBCP

何为数据源呢&#xff1f;也就是数据的来源。我在前面的一篇文章《JDBC原生数据库连接》中&#xff0c;采用了mysql数据库&#xff0c;数据来源于mysql&#xff0c;那么mysql就是一种数据源。在实际工作中&#xff0c;除了mysql&#xff0c;往往还会有Oracle&#xff0c;sql se…

如果成为一名高级安卓开发_什么是高级开发人员,我如何成为一名开发人员?

如果成为一名高级安卓开发Becoming a Senior Developer is something many of us strive for as we continue our code journey and build our career. But what does it actually mean to be a "Senior" Developer?成为一名高级开发人员是我们许多人在继续我们的代…

拍牌神器是怎样炼成的(三)---注册全局热键

要想在上海拍牌的超低中标率中把握机会、占得先机&#xff0c;您不仅需要事先准备好最优的竞拍策略&#xff0c;还要制定若干套应急预案&#xff0c;应对不时之需。既定策略交给计算机自动执行&#xff0c;没有问题。可是谁来召唤应急预案呢&#xff1f;使用全局热键应该是个不…

eclipse 变成中文

官方下载 http://www.eclipse.org/babel/downloads.php 按照自己的eclipse版本下载对应的 复制链接 到eclipse ->help->Install New Software 勾选自己的语言包 如&#xff1a; 等待 安装完成 &#xff0c;无过不好用 更改 右键 属性 更改位置 加后缀 D:\xinle_eclips…

框架模式与设计模式之区别

http://my.oschina.net/u/991183/blog/109854 有很多程序员往往把框架模式和设计模式混淆&#xff0c;认为MVC是一种设计模式。实际上它们完全是不同的概念。框架、设计模式这两个概念总容易被混淆&#xff0c;其实它们之间还是有区别的。框架通常是代码重用&#xff0c;而设计…

村上春树 开始写作_如何克服对写作的恐惧并找到开始的动力

村上春树 开始写作Writing about our work is one of those things that most of us have on our to-do list. But whether its due to procrastination or fear, we never actually get to it. Heres some more motivation and reasons why you should give it a shot!撰写我们…

一个基于组件的动态对象系统

http://hulefei29.iteye.com/blog/1490889 一、静态的痛苦 作为一个项目经验丰富的程序员&#xff0c;你经常会遇到游戏开发过程中的“反复”(iterations)&#xff1a;今天美术将一个静态的模型改为骨骼模型并添加了动画&#xff1b;明天企划会议上决定把所有未拾取武器由…

Lua生成Guid(uuid)

全局唯一标识符&#xff08;GUID&#xff0c;Globally Unique Identifier&#xff09;也称作 UUID(Universally Unique IDentifier) 。GUID是一种由算法生成的二进制长度为128位的数字标识符。GUID主要用于在拥有多个节点、多台计算机的网络或系统中。在理想情况下&#xff0c;…

c:if标签的使用

1、标签的基本介绍 <c:if> 标签必须要有test属性&#xff0c;当test中的表达式结果为true时&#xff0c;则会执行本体内容&#xff1b;如果为false&#xff0c;则不会执行。例如&#xff1a;${requestScope.username admin}&#xff0c;如果requestScope.username等adm…

ecs和eks 比较_如何使用Kubernetes,EKS和NGINX为网站设置DNS

ecs和eks 比较As the creator of Foo, a platform for website quality monitoring, I recently endeavored in a migration to Kubernetes and EKS (an AWS service).作为网站质量监控平台Foo的创建者&#xff0c;我最近努力迁移到Kubernetes和EKS(一种AWS服务)。 Kubernetes…

仅需6步,教你轻易撕掉app开发框架的神秘面纱(1):确定框架方案

遇到的问题 做游戏的时候用的是cocos2dxlua&#xff0c;游戏开发自有它的一套框架机制。而现在公司主要项目要做android和iOS应用。本文主要介绍如何搭建简单易用的App框架。 如何解决 对于新手来说&#xff0c;接触一门新的知识&#xff0c;往往会思考该怎么入手&#xff0c;…

js全局变量污染

一.定义全局变量命名空间 只创建一个全局变量&#xff0c;并定义该变量为当前应用容器&#xff0c;把其他全局变量追加在该命名空间下 var my{}; my.name{big_name:"zhangsan",small_name:"lisi" }; my.work{school_work:"study",family_work:&q…

cached-query 将缓存和查询数据库高速连接起来的轻类库

介绍 我们经常有这种需求&#xff1a;当我们把memcached增加到项目后我还还要写一个 cacheUtils 或者 cacheManager 之类的类来操作memcached。而且一般的操作不外乎是这种操作&#xff1a; 拿到一段sql&#xff0c;先去memcahed里面看下是否有缓存&#xff0c;假设有就直接返回…

全栈Python Flask教程-建立社交网络

Learn how to build a basic social platform with the Python Flask web framework. 了解如何使用Python Flask网络框架构建基本的社交平台。 In this video, we show you how to:在此视频中&#xff0c;我们向您展示如何&#xff1a; how to create a database, 如何创建数…

py执行系统命令

py执行系统命令 1. os.system In [32]: run os.system("date") Thu Jan 28 09:41:25 CST 2016 In [33]: run Out[33]: 0 只能得到返回值&#xff0c;无法得到输出。 2. os.popen In [35]: run os.popen("date") In [36]: run.read Out[36]: <function…

仅需6步,教你轻易撕掉app开发框架的神秘面纱(2):MVP比MVC更好吗

对于程序框架的选择&#xff0c;由于android天然的MVC&#xff0c;本来不需要另外设计直接使用即可。但是我更加钟情于MVP模式&#xff0c;对于其将ui完全与业务逻辑分离的思路很赞同。 那么什么是业务逻辑&#xff1f;个人认为&#xff0c;对数据&#xff08;即MVC中的M&…

一、nginx 安装

添加官方 yum 源 1 vim /etc/yum.repos.d/nginx.rep 输入以下内容&#xff08;OS为你的系统&#xff0c;OSRELEASE 系统版本&#xff09; 1 [nginx] 2 namenginx repo 3 baseurlhttp://nginx.org/packages/mainline/OS/OSRELEASE/$basearch/ 4 gpgcheck0 5 enabled1 列出可安装…

华为技术面试编码题_最佳技术编码面试准备书

华为技术面试编码题Technical coding interviews are notoriously difficult — almost borderline quiz-like for those unprepared. It can sometimes be a daunting task to navigate all the technical coding preparation resources available online, and one might as…

仅需6步,教你轻易撕掉app开发框架的神秘面纱(3):构造具有个人特色的MVP模式

1. MVP的问题 之前我们说过MVP模式最大的问题在于&#xff1a;每写一个Activity/Fragment需要写4个对应的文件&#xff0c;对于一个简易的app框架来说太麻烦了。所以我们需要对MVP进行一定的简化。 关于MVP模式是什么及其简单实现&#xff0c;可以参照&#xff1a;浅谈 MVP i…

Java进阶之自动拆箱与自动装箱

序. java基本类型介绍 java中&#xff0c;基本数据类型一共有8种&#xff0c;详细信息如下表&#xff1a; 类型大小范围默认值byte8-128 - 1270short16-32768 - 327680int32-2147483648-21474836480long64-9233372036854477808-92333720368544778080float32-3.40292347E38-3.40…

Ceilometer Polling Performance Improvement

Ceilometer的数据采集agent会定期对nova/keystone/neutron/cinder等服务调用其API的获取信息&#xff0c;默认是20秒一次&#xff0c; # Polling interval for pipeline file configuration in seconds.# (integer value)#pipeline_polling_interval 20 这在大规模部署中会对O…