C++ vs2008, 我想实现读取一个位图中像素值,存到一个二维数组里的功能。

像素值可以是灰度值,或者rgb各值之和。大家给点思路,我看好多的图像处理库的,都不会用。要最简洁的方法。opencv有相关函数没?... 像素值可以是灰度值,或者rgb各值之和。
大家给点思路,我看好多的图像处理库的,都不会用。
要最简洁的方法。
opencv有相关函数没?
展开
 我来答
百度网友42e02c5
2011-02-01 · TA获得超过1231个赞
知道小有建树答主
回答量:506
采纳率:0%
帮助的人:538万
展开全部
这是一个将bmp的rgb转化会灰度图的程序,处理方法你可以自己筛选
//loadbmp.h

#if ! defined (_LOADBMP_H)
#define _LOADBMP_H

#if ! defined (EXTRA_NAME)
#define EXTRA_NAME "~EX."
#endif

#include <afx.h>
#include <iostream>
#include <windows.h>
#include <math.h>
#include <ctime>
using namespace std;

#define pi (double)3.14159265359

int nWidth;
int nHeight;
int nLen;
int nByteWidth;
BYTE *lpBackup;
BYTE *lpBitmap;
BYTE *lpBits;
CString FileName;
CString Front;
CString Rear;

/*复数定义*/
typedef struct
{
double re;
double im;
}COMPLEX;

/*复数加运算*/
COMPLEX Add(COMPLEX c1, COMPLEX c2)
{
COMPLEX c;
c.re=c1.re+c2.re;
c.im=c1.im+c2.im;
return c;
}

/*复数减运算*/
COMPLEX Sub(COMPLEX c1, COMPLEX c2)
{
COMPLEX c;
c.re=c1.re-c2.re;
c.im=c1.im-c2.im;
return c;
}

/*复数乘运算*/
COMPLEX Mul(COMPLEX c1, COMPLEX c2)
{
COMPLEX c;
c.re=c1.re*c2.re-c1.im*c2.im;
c.im=c1.re*c2.im+c2.re*c1.im;
return c;
}

void GetPoints(BYTE *lpPoints)
{
int x,y,p;
for(y=0;y<nHeight;y++)
{
for(x=0;x<nWidth;x++)
{
p=x*3+y*nByteWidth;
lpPoints[x+y*nWidth]=(BYTE)(0.299*(float)lpBits[p+2]+0.587*(float)lpBits[p+1]+0.114*(float)lpBits[p]+0.1);
}
}
}

void PutPoints(BYTE *lpPoints)
{
int x,y,p,p1;
for(y=0;y<nHeight;y++)
{
for(x=0;x<nWidth;x++)
{
p=x*3+y*nByteWidth;
p1=x+y*nWidth;
lpBits[p]=lpPoints[p1];
lpBits[p+1]=lpPoints[p1];
lpBits[p+2]=lpPoints[p1];
}
}
}

void CuttheName()
{
int Position;
Position=FileName.Find('.');
Front=FileName.Left(Position);
Rear=FileName.Mid(Position+1);
}

void LoadBitmap()
{
BITMAPINFOHEADER *pInfo;
pInfo=(BITMAPINFOHEADER *)(lpBitmap+sizeof(BITMAPFILEHEADER));
nWidth=pInfo->biWidth;
nByteWidth=nWidth*3;
if (nByteWidth%4) nByteWidth+=4-(nByteWidth%4);
nHeight=pInfo->biHeight;
if (pInfo->biBitCount!=24)
{
if (pInfo->biBitCount!=8)
{
cout<<"Invalidation Bitmap";
delete lpBitmap;
lpBitmap=0;
return;
}
unsigned int PaletteSize=1<<pInfo->biBitCount;
if (pInfo->biClrUsed!=0 && pInfo->biClrUsed<PaletteSize) PaletteSize=pInfo->biClrUsed;
lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
RGBQUAD *pPalette=(RGBQUAD *)lpBits;
lpBits+=sizeof(RGBQUAD)*PaletteSize;
nLen=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nByteWidth*nHeight;
BYTE *lpTemp=lpBitmap;
lpBitmap=new BYTE[nLen];
BITMAPFILEHEADER bmh;
BITMAPINFOHEADER bmi;
bmh.bfType='B'+'M'*256;
bmh.bfSize=nLen;
bmh.bfReserved1=0;
bmh.bfReserved2=0;
bmh.bfOffBits=54;
bmi.biSize=sizeof(BITMAPINFOHEADER);
bmi.biWidth=nWidth;
bmi.biHeight=nHeight;
bmi.biPlanes=1;
bmi.biBitCount=24;
bmi.biCompression=BI_RGB;
bmi.biSizeImage=0;
bmi.biXPelsPerMeter=0;
bmi.biYPelsPerMeter=0;
bmi.biClrUsed=0;
bmi.biClrImportant=0;
int nBWidth=pInfo->biWidth;
if (nBWidth%4) nBWidth+=4-(nBWidth%4);
memset(lpBitmap,0,nLen);
memcpy(lpBitmap,&bmh,sizeof(BITMAPFILEHEADER));
memcpy(lpBitmap+sizeof(BITMAPFILEHEADER),&bmi,sizeof(BITMAPINFOHEADER));
BYTE *lpBits2=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
int x,y,p1,p2,Palette;
for(y=0;y<nHeight;y++)
{
for(x=0;x<nWidth;x++)
{
p1=y*nBWidth+x;
p2=y*nByteWidth+x*3;
if (lpBits[p1]<PaletteSize) Palette=lpBits[p1];
else Palette=0;
lpBits2[p2]=pPalette[Palette].rgbBlue;
lpBits2[p2+1]=pPalette[Palette].rgbGreen;
lpBits2[p2+2]=pPalette[Palette].rgbRed;
}
}
delete lpTemp;
}
lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
if (lpBackup) delete lpBackup;
lpBackup=new BYTE[nLen];
memcpy(lpBackup,lpBitmap,nLen);
}

void OpenFile()
{
CFile File=0;
if (!File.Open(FileName,CFile::modeRead)) return;
CuttheName();
if (lpBitmap) delete lpBitmap;
nLen=File.GetLength();
lpBitmap=new BYTE[nLen];
File.Read(lpBitmap,nLen);
LoadBitmap();
}

void SaveAs()
{
CFile file;
if (lpBitmap==0) return;
if (!file.Open(Front+EXTRA_NAME+Rear,CFile::modeWrite|CFile::modeCreate))
{
cout<<"ERROR~~\n";
return;
}
int nLen=nByteWidth*nHeight;
BYTE *pMem=new BYTE[nLen+sizeof(BITMAPINFOHEADER)];
BITMAPINFOHEADER *bmi=(BITMAPINFOHEADER *)pMem;
bmi->biSize=sizeof(BITMAPINFOHEADER);
bmi->biWidth=nWidth;
bmi->biHeight=nHeight;
bmi->biPlanes=1;
bmi->biBitCount=24;
bmi->biCompression=BI_RGB;
bmi->biSizeImage=0;
bmi->biXPelsPerMeter=0;
bmi->biYPelsPerMeter=0;
bmi->biClrUsed=0;
bmi->biClrImportant=0;
BITMAPFILEHEADER bmh;
bmh.bfType='B'+'M'*256;
bmh.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nLen;
bmh.bfReserved1=0;
bmh.bfReserved2=0;
bmh.bfOffBits=54;
memcpy(pMem+sizeof(BITMAPINFOHEADER),lpBits,nLen);
file.Write(&bmh,sizeof(BITMAPFILEHEADER));
file.Write(pMem,nLen+sizeof(BITMAPINFOHEADER));
file.Close();
}

#endif

//nocolor.cpp
#define EXTRA_NAME "@nocolor."
#include "loadbmp.h"

void NoColor()
{
if (lpBitmap==0) return;
int x,y,p;
BYTE Point;
for(y=0;y<nHeight;y++)
for(x=0;x<nWidth;x++)
{
p=x*3+y*nByteWidth;
Point=(BYTE)(0.299*(float)lpBits[p+2]+0.587*(float)lpBits[p+1]+0.114*(float)lpBits[p]+0.1);
lpBits[p+2]=Point;
lpBits[p+1]=Point;
lpBits[p]=Point;
}
}

void main(int argc, char *argv[])
{
if(argc==2)
FileName=argv[1];
else
return;
OpenFile();
NoColor();
SaveAs();
}
百度网友58754d264
2011-01-30
知道答主
回答量:32
采纳率:0%
帮助的人:26.2万
展开全部
opencv有现成的函数 只是求和的话就非常简单了 里面有个宏就是直接取像素值的 图像都是逐行逐列读取的 以前写过大概伪代码这样的
前面是读文件 open什么什么的
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
{
bitValue[i][[j]= 宏(i,j);//取值
sum+=bitvalue[i][j];//求和
}
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
敛正雅7f
2011-01-24 · TA获得超过2031个赞
知道大有可为答主
回答量:1553
采纳率:0%
帮助的人:1754万
展开全部
这个你去看位图格式的定义,然后像打开文件一样打开它。一般开头是一堆文件信息。找出存着像素信息的地方。。开始读取图片像素。
这有一个2005的例子,代码应该是一样的。http://apps.hi.baidu.com/share/detail/9124512

参考资料: http://wenku.baidu.com/view/910b19eeaeaad1f346933fdd.html

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式