CImage访问像素及其像素操作总结
MSDN的代码
- COLORREF pixel;
- int maxY = imgOriginal.GetHeight(), maxX = imgOriginal.GetWidth();
- byte r,g,b,avg;
- for (int y=0; y<maxY; y++) {
- for (int x=0; x<maxX; x++) {
- pixel = imgOriginal.GetPixel(x,y);
- r = GetRValue(pixel);
- g = GetGValue(pixel);
- b = GetBValue(pixel);
- avg = (r+ g+ b)/3;
- imgOriginal.SetPixelRGB(x,y,avg,avg,avg);
- }}
这种方式效率很低, 因为每次调用getpixel,都包含着程序的进栈和出栈。所以,面对大量需要处理的数据,采用直接访问内存地址的方法。
- byte* pRealData;
- pRealData=(byte*)imgOriginal.GetBits();
- int pit=imgOriginal.GetPitch();
- int bitCount=imgOriginal.GetBPP()/8;
- for (int y=0; y<maxY; y++) {
- for (int x=0; x<maxX; x++) {
- int grayVal=(int)(int)(*(pRealData + pit*y + x*bitCount))*0.3
- + (int)(int)(*(pRealData + pit*y + x*bitCount +1))*0.59
- + (int)(int)(*(pRealData + pit*y + x*bitCount +2))*0.11;
- *(pRealData + pit*y + x*bitCount)=grayVal;
- *(pRealData + pit*y + x*bitCount +1)=grayVal;
- *(pRealData + pit*y + x*bitCount +2)=grayVal;
- //如果是8位灰度图像,直接读取一个BYTE位为灰度值
- //如果是24位RGB图像,则依次读取pixAddr,pixAddr+1,pixAddr+2为B、G、R分量值
- }}
用两种方法对同一张图片(3264*2448像素)进行处理,前者需要1分钟,后者只需1秒左右。
所以,后者比前者至少快60倍
直接访问内存地址的另一种方式:
int i,j,temp;
int pixel[4];
int width = yuantu.GetWidth();
int height = yuantu.GetHeight();
int widthBytes = yuantu.GetPitch();
bianyuantu.Create(width,height,yuantu.GetBPP()); if(yuantu.IsIndexed())
{
yuantu.GetColorTable(0,256,colorTable);
bianyuantu.SetColorTable(0,256,colorTable);
}
BYTE *pYuantuData = (BYTE*)yuantu.GetBits();
BYTE *pBianyuantuData =(BYTE*)bianyuantu.GetBits(); for(j=0;j<height-1;j++)
{
for(i=0;i<width-1;i++)
{
pixel[0]=pYuantuData[j*widthBytes+i];
pixel[1]=pYuantuData[j*widthBytes+i+1];
pixel[2]=pYuantuData[(j+1)*widthBytes+i];
pixel[3]=pYuantuData[(j+1)*widthBytes+i+1];
temp=(int)sqrt((double)((pixel[0]-pixel[3])*(pixel[0]-pixel[3])
+(pixel[1]-pixel[2])*(pixel[1]-pixel[2]))); //罗伯特算子
pBianyuantuData[j*widthBytes+i]=temp;
}
}
彩色图像转化为灰度图的处理方式
//真彩色图像变为灰度图,直接修改像素点的值
- void PixelsChangedToGray(CImage *pImage)
- {
- int nByte,j,i,nWidth,nHeight,nBytesPerPixel;
- BYTE *pPixelLine,cNewPixelValue;
- nWidth=pImage->GetWidth(); nHeight=pImage->GetHeight();
- nBytesPerPixel= pImage->GetBPP()/8;
- for (i=0;i<nHeight;i++){
- pPixelLine =(BYTE*) pImage->GetPixelAddress(0,i);
- nByte=0;
- for (j=0;j<nWidth;j++){ cNewPixelValue=(BYTE)(0.11*pPixelLine[nByte]
- +0.59*pPixelLine[nByte+1]
- +0.30*pPixelLine[nByte+2]);
- pPixelLine[nByte] = pPixelLine[nByte+1] = pPixelLine[nByte+2]
- = cNewPixelValue;
- nByte+=nBytesPerPixel;
- }
- }
- }
//非真彩色图像变为灰度图,修改调色板信息
- void PaletteChangedToGray(CImage *pImage)
- {
- RGBQUAD ColorTabs[256];
- int i,nColorTableEntries,nNewGrayColor;
- nColorTableEntries=pImage->GetMaxColorTableEntries();
- pImage->GetColorTable(0,nColorTableEntries,ColorTabs);
- for (i=0;i<nColorTableEntries;i++){
- nNewGrayColor=(int)(0.11*ColorTabs[i].rgbBlue
- + 0.59*ColorTabs[i].rgbGreen
- + 0.30*ColorTabs[i].rgbRed);
- ColorTabs[i].rgbBlue = (BYTE)nNewGrayColor;
- ColorTabs[i].rgbGreen = (BYTE)nNewGrayColor;
- ColorTabs[i].rgbRed = (BYTE)nNewGrayColor;
- }
- pImage->SetColorTable(0,nColorTableEntries,ColorTabs);
- }
CImage访问像素及其像素操作总结的更多相关文章
- OpenCV(2)-Mat数据结构及访问Mat中像素
Mat数据结构 一开始OpenCV是基于C语言的,在比较早的教材例如<学习OpenCV>中,讲解的存储图像的数据结构还是IplImage,这样需要手动管理内存.现在存储图像的基本数据结构是 ...
- SNMP 原理及配置简述 net-snmp-utils net-snmp 第2版基于SNMP 群体名(community name) 第3版引入了安全性更高的访问控制方法 SNMP协议操作只有4种 Apache的php_snmp 模块
SNMP 原理及配置简述 net-snmp-utils net-snmp 第2版基于SNMP 群体名(community name) 第3版引入了安全性更高的访问控制方法 SNMP协议操作只有4种 ...
- C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它
C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它 网上的代码都比较复杂,还是这个简单 见代码, 简易解决办法: 主窗体代码 using System; ...
- ADO.NET访问Access(文本数据库)数据操作(CRUD)
1,ADO.NET访问Access(文本数据库)数据操作(CRUD) 2,DatabaseDesign 文本数据库Northwind.mdb 3,/App_Code 3.1,/App_Code/DBC ...
- GG_DataAccess 数据库访问层使用dapper操作
3.5.GG_DataAccess 数据库访问层使用dapper操作 和Model实体类同理,tt模板已写好,需要的可加qq群:547765059 自己下载.
- 《OpenCV3编程入门》访问图像中像素的三类方法
·方法一 指针访问:C操作符[ ]; ·方法二 迭代器iterator; ·方法三 动态地址计算; #include <opencv2/core/core.hpp> #include &l ...
- 通过一个小Trick实现shader的像素识别/统计操作
2018/12/14日补充:后来发现compute shader里用AppendStructuredBuffer可以解决这类问题,请看这里:https://www.cnblogs.com/hont/p ...
- opencv 中对一个像素的rgb值或像素值进行操作的几个常用小办法【转】
You can access the Image pixels in many ways:1. One using the Inbuilt macro2. One using the pointer ...
- OpenCV 学习笔记(11)像素级别指针操作
//优化两图的连接处,使得拼接自然 void OptimizeSeam(Mat& img1, Mat& trans, Mat& dst) { int start = MIN(c ...
随机推荐
- python学习笔记:第二天(运算符)
Python3 运算符 注:以下部分示例源自于http://www.runoob.com/ 1.算术运算符 假设变量a为10,变量b为20: 运算符 描述 实例 + 加 - 两个对象相加 a + b ...
- match_parent 、 fill_parent 、 wrap_content
1)fill_parent 设置一个构件的布局为fill_parent将强制性地使构件扩展,以填充布局单元内尽可能多的空间.这跟Windows控件的dockstyle属性大体一致. 设置一个顶部布局或 ...
- python print 字体颜色
例子: print '\033[35;43m(1)ip转换成数字\033[0m' \033[35;43m ===>35列属于字颜色,43列属于背景颜色 字背景颜色范围: 40--49 4 ...
- bzoj 5072 [Lydsy1710月赛]小A的树——树形dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5072 发现对于每个子树,黑点个数确定时,连通块的大小取值范围一定是一段区间:所以考虑只最小化 ...
- SQL repeat()函数
转自:https://www.yiibai.com/sql/sql-repeat-function.html REPEAT(str,count) 返回一个字符串组成的字符串STR重复的次数.如果计数小 ...
- Linux安装ntp同步时间
1.安装 yum install ntp 安装下就可以了. 2.寻找一个网络时间服务器,比如一些国家授时中心 微软公司授时主机(美国) time.windows.com 台警大授时中心(台湾) as ...
- HDOJ-2047
阿牛的EOF牛肉串 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- TypeScript完全解读(26课时)_3.TypeScript完全解读-Symbol
ts中symbol的支持是按照es6的标准来的,只要我们学会es6中的symbol,就可以直接在ts中使用了 创建symbol 在example文件夹下新建symbol.ts 然后在根目录的index ...
- 把myeclipse中html/jsp文件的视图调到只看代码
烦恼———————————————————— 解决方法: ok---------------------------- *.jsp 同理
- 洛谷 - P1020 - 导弹拦截 - 最长上升子序列
https://www.luogu.org/problemnew/show/P1020 终于搞明白了.根据某定理,最少需要的防御系统的数量就是最长上升子序列的数量. 呵呵手写二分果然功能很多,想清楚自 ...