C/C++编程如何把图片导入变成矩阵数据

作者&投稿:任达 (若有异议请与网页底部的电邮联系)
C++编程如何把图片导入变成矩阵数据~

第一个问题很麻烦,因为一个BMP图包含的信息部仅仅是每个点的数据,还有很多bitmap格式信息,
解决方法:首先你要确定你用什么环境,vc++6.0,2003,2005可用的办法不一样
然后,去网上搜一段写好了的函数或类来解决这个问题,他的实现方法如果你对bmp格式文件存储没有兴趣的话大可以不必关心,与图像处理没有关系。

然后是太阳的问题:这个问题可以简单可以复杂,如果简单处理的话,选择一个阈值,对矩阵中的每个点与该值比较,符合的就被认为是太阳,否则不是,推荐在HSI空间内做,不要在RGB空间做,这样简单一些。但问题是,要求被处理的图片的的情况类似,否则固定阈值就不能很好的区分。
如果画面中只有太阳,可以考虑首先提取圆形区域出来,然后处理。
如果画面中,太阳和其他区域的亮度区间比较集中,可以考虑用直方图处理。
……
越说越复杂了,这个可以考虑参考 机器视觉 方面的书(注意不是图像处理,那些书主要讲滤镜的)

1.Matlab软件可以自动保存中间变量的值并可以可视化方式显示

2.下面详细介绍在VS中如何将图像的数据导出出Excel中
3.如果VS已经配置好了OpenCV库,那么可以将下面程序直接得到到你新建的工程文件中运行

#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
IplImage* Igray = 0;
IplImage* It = 0;
IplImage* Iat;
void main()
{
Igray = cvLoadImage("hand.jpg", CV_LOAD_IMAGE_GRAYSCALE);//加载图像的函数
It = cvCreateImage(cvSize(Igray->width, Igray->height), IPL_DEPTH_8U, 1);
Iat = cvCreateImage(cvSize(Igray->width, Igray->height), IPL_DEPTH_8U, 1);

cvThreshold(Igray, It, 150, 255, CV_THRESH_BINARY);//单一阈值
cvAdaptiveThreshold(Igray, Iat, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 3, 5);//自适应阈值

CvScalar p; //保存通道的像素
ofstream outfile("../OpenCVTest/output/gray.xls");
for (int i = 0; iheight; i++)
{

for (int j = 0; jwidth; j++)
{
//if (i==0)
// outfile << "第" << j << "列";
//if (0==j)
//outfile << "第" << i << "行";
p = cvGet2D(Iat, i, j);
outfile << p.val[0] << "";
}
outfile << endl;
} //*/

cvNamedWindow("orignal", 1);
cvNamedWindow("threshold", 1);
cvNamedWindow("adaptiveThresh", 1);
cvShowImage("orignal", Igray);
cvShowImage("threshold", It);
cvShowImage("adaptiveThresh", Iat);

cvWaitKey(0);

cvReleaseImage(&Igray);
cvReleaseImage(&It);
cvReleaseImage(&Iat);

cvDestroyWindow("orignal");
cvDestroyWindow("threshold");
cvDestroyWindow("adaptiveThresh");

}

4.注意上面代码中的加粗行:一个是加载图像的函数;一个是导出图像数据的函数
此外最重要的一句是:outfile << p.val[0] << "";
其中的“"一定要添加,它是制表符,这样能够使图像数据对应到Excel中的每一行每一列

注:其他程序的输出代码类似,一定要在输出的代码语句中添加格式控制"",方可完美导出到Excel
5.如果ofstream outfile("../OpenCVTest/output/gray.xls");这句中的xls改成txt,则输出的数据格式比较乱,不易观察行列数
6.导出到Excel后,可以方面查看第几行第几列的数据,比如查看第10行第6列

void CTestSaveBmpView::SaveAsBmp(CString filename)
{
//定义图形大小
int iWidth = 800;
int iHeight = 600;
int iPixel = 16;
//图形格式参数
LPBITMAPINFO lpbmih = new BITMAPINFO;
lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmih->bmiHeader.biWidth = iWidth;
lpbmih->bmiHeader.biHeight = iHeight;
lpbmih->bmiHeader.biPlanes = 1;
lpbmih->bmiHeader.biBitCount = iPixel;
lpbmih->bmiHeader.biCompression = BI_RGB;
lpbmih->bmiHeader.biSizeImage = 0;
lpbmih->bmiHeader.biXPelsPerMeter = 0;
lpbmih->bmiHeader.biYPelsPerMeter = 0;
lpbmih->bmiHeader.biClrUsed = 0;
lpbmih->bmiHeader.biClrImportant = 0;

//创建位图数据
HDC hdc,hdcMem;
HBITMAP hBitMap = NULL;
CBitmap *pBitMap = NULL;
CDC *pMemDC = NULL;
BYTE *pBits;

hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
hdcMem = CreateCompatibleDC(hdc);
hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
pBitMap = new CBitmap;
pBitMap->Attach(hBitMap);
pMemDC = new CDC;
pMemDC->Attach(hdcMem);
pMemDC->SelectObject(pBitMap);
//
CRect rc(0,0,iWidth,iHeight);
pMemDC->SetBkMode(TRANSPARENT);
//添加自绘图形
DrawCurve(pMemDC,rc);
//保存到文件并创建位图结构
BITMAPFILEHEADER bmfh;
ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
*((char *)&bmfh.bfType) = ""B"";
*(((char *)&bmfh.bfType) + 1) = ""M"";
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;

TCHAR szBMPFileName[128];
int iBMPBytes = iWidth * iHeight * iPixel / 8;
strcpy(szBMPFileName,filename);
CFile file;
if(file.Open(szBMPFileName,Cfile::modeWrite | Cfile::modeCreate))
{
file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
file.Write(pBits,iBMPBytes);
file.Close();
}

pMemDC->DeleteDC();
delete pMemDC; pMemDC = NULL;
delete pBitMap; pBitMap = NULL;
delete lpbmih; lpbmih = NULL;
}

//输出文本和图形

void CTestSaveBmpView::DrawCurve(CDC *pDC, CRect rcClient)
{
//页面背景色
CBrush brushCtl;
brushCtl.CreateSolidBrush(RGB(255,255,255));
pDC->Rectangle(rcClient);
pDC->FillRect(rcClient,&brushCtl) ;
brushCtl.DeleteObject();

CPen pen;
pen.CreatePen(PS_SOLID, 1, RGB(255,0,0));
CPen *oldPen = pDC->SelectObject(&pen);

double xMin = 10.00f, xMax = 100.00f;
double yMin = 10.00f, yMax = 200.00f;

double dbX1 = (xMax- xMin)/100 + xMin;
double dbY1 = 600/dbX1 ;
for (int i=1; i<100; i++) //曲线
{
double dbX2 = (xMax- xMin)*i/100 + xMin;
double dbY2 = 600/dbX2 ;

pDC->MoveTo(int(rcClient.left+(dbX1 - xMin)*rcClient.Width()/(xMax- xMin)),
int(rcClient.bottom-(dbY1- yMin)*rcClient.Height()/(yMax- yMin)));
pDC->LineTo(int(rcClient.left+(dbX2 - xMin)*rcClient.Width()/(xMax- xMin)),
int(rcClient.bottom-(dbY2- yMin)*rcClient.Height()/(yMax- yMin)));

dbX1=dbX2;
dbY1=dbY2;
}
pDC->SelectObject(oldPen);
pen.DeleteObject();
oldPen = NULL;
}

//保存的实现
void CTestSaveBmpView::OnRButtonDown(UINT nFlags, CPoint point)
{

CFileDialog dlg(false,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "位图文件(*.bmp)|*.bmp|",NULL);
if (dlg.DoModal()!= IDOK) return;
CString filename = dlg.GetFileName() + ".bmp";
SaveAsBmp(filename);

CView::OnRButtonDown(nFlags, point);
}


索县19416624500: 怎样用c语言实现图片的导入和图片移动 -
鄞差兰苏: 如果只用C语言实现,有一定难度!首先你必须进入C语言图形模式,然后自己写代码读取图片文件,将图片的像素信息保存在数组中,然后依次读取图片的像素数据,再将像素值写入显存...

索县19416624500: 求个c++的读入图片,输出图片的代码 -
鄞差兰苏: 和普通的读法一样,不过图片是要存二进制文件,你输出的只是ASCII吗,你看到的全是乱码.fstream file1;file1.open("7.jpg",ios::in|ios::binary);//读char ch;while (!file1.eof()){ file1.read(&ch,1); cout<<ch;} 这根本没有什么意义啊~~在C++可视化编程里如果你想把一个图片保存,再打开图片的话,用MFC的序列化是可以的

索县19416624500: C/C++编程如何把图片导入变成矩阵数据
鄞差兰苏: void CTestSaveBmpView::SaveAsBmp(CString filename) { //定义图形大小 int iWidth = 800; int iHeight = 600; int iPixel = 16; //图形格式参数 LPBITMAPINFO lpbmih = new BITMAPINFO; lpbmih-&gt;bmiHeader.biSize = sizeof(...

索县19416624500: C++编程如何把图片导入变成矩阵数据 -
鄞差兰苏: 第一个问题很麻烦,因为一个BMP图包含的信息部仅仅是每个点的数据,还有很多bitmap格式信息,解决方法:首先你要确定你用什么环境,vc++6.0,2003,2005可用的办法不一样 然后,去网上搜一段写好了的函数或类来解决这个问题,他的实...

索县19416624500: 用c/c++怎样用自己制作的图片导入到软件中做背景? -
鄞差兰苏: Windows程序的话可以处理WM_ERASEBKGND消息,在里面用刷子把图片刷在背景上即可.加载图片可以用LoadImage这个Win32 API.

索县19416624500: 用c++编写一个系统,如何将照片上传上去? -
鄞差兰苏: 要看你用的是Borland C++ Builder还是Visual C++.Net,他们的控件和图像类不同,方法也不同.如果是.Net的话,看看CImage类吧;如果是Borland C++ Builder,那么就看看Graphics::TBitmap类和TJPEGImage类吧.

索县19416624500: 用c++语言打开/保存一幅图片的代码? -
鄞差兰苏: #include<iostream>using namespace std; void OpenAndSavePic() { char name[50];//文件名 int length;//文件长度 char *buf;//文件内容 memset(name, 0, 50); cout << "输入要打开的图片:"; cin >> name; FILE * f = fopen(name, "rb");//...

索县19416624500: C++中怎么把位图输出到窗口 -
鄞差兰苏: #include int PaintBitmap (HWND hwnd ,HBITMAP hBitmap) { RECT rect ; BITMAP bitmap ; HDC hdcSrc = GetDC (hwnd) ; HDC hdcBmp = CreateCompatibleDC (hdcSrc) ; SelectObiect (hdcBmp ,hBitmap) ; GetClientRect (hwnd ,&rect) ; GetObject ...

索县19416624500: C语言 怎么将图片导入 并获得图片地址?并使用函数处理这个图片? -
鄞差兰苏: step1,获取图片文件字节数sizestep2,动态申请size大小的空间,首地址给指针pData;step3,open函数以二进制模式打开图片文件,用fread函数将图片读...

索县19416624500: c语言中如何导入图片? -
鄞差兰苏: 如果要显示图片,关键是要了解这些存储格式的内容和含义, 用函数initgraphs(int Vmode)完成(也就是利用bios中的int 10中断来实现), 主要要把色表(color map)按BMP格式添好,就OK了!有关图象格式的内容要查相关内容, 其中还要涉及显卡内部的寄存器有关知识. 所以比较复杂

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网