1. 程式人生 > >影象畫素點讀取和賦值

影象畫素點讀取和賦值


//取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);