一、读取图像
1、利用Mat数据结构读取和显示图片
#include"cv.h" #include "highgui.h" #include<iostream> using namespace std; using namespace cv; int _tmain(int argc, _TCHAR* argv[]) { Mat img=imread("./ImageData/sf1.png");//图片的相对路径 namedWindow("new"); imshow("new",image); return 0; }
2、利用IplImage指针读取并显示图片
IplImage* image=cvLoadImage("./ImageData/Im_49.png"); cvNamedWindow("image",1); cvShowImage("image",image);
二、访问图像中像元的光谱值
按照图像类型可以将图像分为单通道图像(灰度图像)和多通道图像(RGB)
1、通过指针直接访问像元的灰度值
a、访问单通道图像
1 //读取rgb彩色图像 2 IplImage* imgTest=cvLoadImage("./ImageData/sf1.jpg"); 3 4 5 uchar tcout; 6 7 //创建同样大小的三个单通道图像 8 IplImage* rImg=cvCreateImage(cvGetSize(imgTest),IPL_DEPTH_8U,1); 9 IplImage* gImg=cvCreateImage(cvGetSize(imgTest),IPL_DEPTH_8U,1); 10 IplImage* bImg=cvCreateImage(cvGetSize(imgTest),IPL_DEPTH_8U,1); 11 12 //将rgb彩色分解到三个单通图像中 13 cvSplit(imgTest,rImg,gImg,bImg,NULL); 14 15 16 //访问当通道图像rImg 17 for (int i=0;i<rImg->height;i++) 18 { 19 for (int j=0;j<rImg->width;j++) 20 { 21 tcout=((uchar *)(rImg->imageData+i*rImg->widthStep))[j]; 22 23 } 24 25 }
这其中有一点需要注意访问时的两个for循环中rImg->heigh和rImg->width的顺序,很有可能写反了出现内存不可访问的问题 ,之前按照网上的程序写老是出现这个问题,修改过后才得以解决(不知道是Opencv版本的问题还是其他原因);问题提示的错误如下图:
b、访问多通道图像
//读取rgb彩色图像 IplImage* imgTest=cvLoadImage("./ImageData/sf1.jpg"); //创建三个单通道图像 IplImage* TImg=cvCreateImage(cvGetSize(imgTest),IPL_DEPTH_8U,1); IplImage* TImg1=cvCreateImage(cvGetSize(imgTest),IPL_DEPTH_8U,1); IplImage* TImg2=cvCreateImage(cvGetSize(imgTest),IPL_DEPTH_8U,1); // uchar* dat2=(uchar*)imgTest->imageData;//以指针的形式访问多通道数据 int step=imgTest->widthStep/sizeof(uchar);//图像中每一行的数据长度 int channels=imgTest->nChannels;//图像通道数 for (int i=0;i<temp->height;i++) { for (int j=0;j<temp->width;j++) { ((uchar *)(TImg->imageData+i*TImg->widthStep))[j]=dat2[i*step+j*channels+0]; ((uchar *)(TImg1->imageData+i*TImg1->widthStep))[j]=dat2[i*step+j*channels+1]; ((uchar *)(TImg2->imageData+i*TImg2->widthStep))[j]=dat2[i*step+j*channels+2]; } }
2、通过cvGet2D()和cvSet2D访问和修改相应像元值
IplImage* image=cvLoadImage("./ImageData/Im_49.png"); for (int i=0;i<image->height;i++) { for (int j=0;j<image->width;j++) { CvScalar s=cvGet2D(image,i,j); s.val[0]>0 s.val[1]=255; s.val[2]=0; cvSet2D(image,i,j,s); } }
时间: 2024-10-30 10:45:54