图像像素点读取和赋值


//取IplImage图像像素值
int main()
{
    IplImage* src = cvLoad("filename",0); //-1默认读取原通道,0 灰度图,1彩色图
    if(src!=0)
    {
        for(int i=0;i<src->height;i++)
        {
            uchar* pixel = (uchar*)src->imageData+i*src->widthStep;
            for(int j=0;j<src->width;j++)
            {
                pixel[3*j] = 0;
                pixel[3*j+1] = 0;
                pixel[3*j+2] = 0;
//另外一种效率不好的算法
                CvScalar s;
                s = cvGet2D(src,i,j); // get the(i,j)pixel value;
                s.val[0] = 0;
                s.val[1] = 0;
                s.val[2] = 0;
                cvSet2D(src,i,j,s);
                //另外一种算法
                int b = CV_IMAGE_ELEM(img, uchar, y1, x1 * 3);
                // image复制到mat 
                CV_IMAGE_ELEM(pImage, uchar, i, j) = CV_MAT_ELEM(*mat, uchar, i, j);
                
            }
        }
    }
}

//取Mat图像像素值
int main()
{
    Mat img = imread("filename");.
    for(int i=0;i<img.rows;i++)
        for(int j=0;j<img.cols;j++)
        {
            if(img.at<Vec3b>(i,j)>128)
                img.at<Vec3b>(i,j) = Vec3b(255,255,255);    
// 若图像为三通道,则取图像像素点和对图像像素点赋值代码
                int Bpix = img.at<Vec3b>(i,j)[0];
                int Gpix = img.at<Vec3b>(i,j)[1];
                int Rpix = img.at<Vec3b>(i,j)[2]; //取像素值
                img.at<Vec3b>(i,j)[0] = 0;  //像素赋值                
//单通道读取像素值
                int Bpix= img.at<uchar>(i,j);
//另一种Mat图像像素读取和赋值代码
                int pix = int(*(img.data+img.step[0]*row + img.step[1]*col));
                *(img.data+img.step[0]*row + img.step[1]*col) = 255;
//另外一种Mat_重载算法
                Mat_ tempSrc = src;
                tempSrc(col,row) = Vec3b(0,0,255);
                //另外一种Mat::ptr模板
                uchar* data = img.ptr(row); // row为行循环
                for(int col=0;col<img.cols;col++)
                {
                    data[col*3] = 0;
                    data[col*3+1] = 0;
                    data[col*3+2] = 0;
                }                
        }    
}

//取CvMat 图像像素值
float vals[] = {0.866025,-0.500000,0.500000,0.866025};
CvMat rotmat;
cvInitMatHeader(&rotmat, 2, 2, CV_32FC1,vals);
//rotmat.step  行数据长度,单位字节数
int pix = *(rotmat.data.fl + i*rotmat.rows + j);
int pix = *((float *)(rotmat.data.ptr + i * rotmat.step) + j); // 对uchar强制转换
//三种CvMat初始化方式
//仅初始化矩阵头,不为数据分配内存空间
CvMat* cvCreateMatHeader(int rows, int cols, int type);
//仅为数据体分配内存空间
void cvCreateData(CvArr* arr);
//既创建cvMat结构又为数据分配内存(最常用)
CvMat* cvCreateMat(int rows, int cols, int type);
//根据矩阵mat克隆一个一模一样的矩阵,不仅矩阵头一样,数据也完全复制过去
CvMat* cvCloneMat(const cvMat* mat);
//如果不想复制数据,可以根据矩阵mat克隆一个一模一样的矩阵头
CvMat* cvInitMatHeader(CvMat* mat, int rows, int cols, int type, void* data=NULL, int step=CV_AUTOSTEP);

//返回数据的值
ElemType data = CV_MAT_ELEM(*mat, ElemType, row, col); 
//返回数据的指针,适用于同时读取和设置,但注意类型转化
ElemType* ptr = (ElemType*)CV_MAT_ELEM_PTR(*mat, row, col);//读
*((ElemType*)CV_MAT_ELEM_PTR(*mat, row, col)) = data;//写
//返回数据的值,可以返回double和CvScalar两种类型
double cvGetReal1D(const CvArr* arr, int idx0);
double cvGetReal2D(const CvArr* arr, int idx0, int idx1);
double cvGetReal3D(const CvArr* arr, int idx0, int idx1, int idx2);
double cvGetRealND(const CvArr* arr, int* idx);
CvScalar cvGet1D(const CvArr* arr, int idx0);
CvScalar cvGet2D(const CvArr* arr, int idx0, int idx1);
CvScalar cvGet3D(const CvArr* arr, int idx0, int idx1, int idx2);
CvScalar cvGetND(const CvArr* arr, int* idx);
//返回数据的指针
uchar* CvPtr1D(const CvArr* arr, int idx0, int* type=NULL);
uchar* CvPtr2D(const CvArr* arr, int idx0, int idx1, int* type=NULL);
uchar* CvPtr1D(const CvArr* arr, int idx0, int idx1, int idx2, int* type=NULL);
uchar* CvPtr1D(const CvArr* arr, int* idx, int* type=NULL, int create_node=1, unsigned * precalc_hashval=NULL);
//此外对于<浮点型单通道矩阵>有两个简便的函数
double cvmGet(const CvMat* mat, int row, int col);
void cvmSet(CvMat* mat, int row, int col, double value);

猜你喜欢

转载自blog.csdn.net/ChangWei_wenzhou/article/details/83580603
今日推荐