天天看點

opencv對遙感圖像基本操作1、python版2、C++版

參考:http://blog.csdn.net/wc781708249/article/details/78485415

1、python版

說明:

資料類型:原類型16bit 4波段 (CV_16UC4),轉成32float(CV_32FC4)處理,處理完成後儲存成CV_16UC4

1.1繪圖與寫文本

# 畫圖
dst=cv2.line(img,(,),(,),(,,),,cv2.LINE_AA) # 畫線
dst = cv2.rectangle(dst,(,),(,),(,,),) # 畫矩形
dst = cv2.circle(dst,(,), , (,,), -) # -1 表示填充
dst = cv2.ellipse(dst,(,),(,),,,,,-)  # 這裡的255 相當于(255,0,0)

# 畫多邊形
pts = np.array([[,],[,],[,],[,]], np.int32)
pts = pts.reshape((-,,))
dst = cv2.polylines(dst,[pts],True,(,,),)

# 寫入文字
font = cv2.FONT_HERSHEY_SIMPLEX # 字型
cv2.putText(dst,'OpenCV',(,), font, ,(,,),,cv2.LINE_AA)
# ----------------------------------------------------------
           

1.2 分割和合并圖像通道

# 分割和合并圖像通道
b,g,r = cv2.split(img)
img = cv2.merge((r,g,b)) # BGR轉成RGB 針對3個波段的
# or
b=img[:,:,]
g=img[:,:,]
r=img[:,:,]
img2 = cv2.merge((r,g,b))

# 多于3個波段
n_data=cv2.split(img)
dst=cv2.merge((n_data[],n_data[],n_data[])) # 這裡隻合并前3個波段
           

1.3 制作邊框圖像

# 制作邊框圖像
dst=cv2.copyMakeBorder(img,,,,,cv2.BORDER_CONSTANT,value=(,,))


replicate = cv2.copyMakeBorder(img,,,,,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img,,,,,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img,,,,,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img,,,,,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img,,,,,cv2.BORDER_CONSTANT,value=(,,))
           

1.4 通路

# 通路和修改像素值
px = img[,] # 通路像素值
img[,] = [,,] # 修改像素值

img.item(,,) # 通路像素值
img.itemset((,,),) # 修改像素值

# 通路圖像屬性
img.shape # [h,w,c]
img.size # h*w*c
img.dtype # float32
type(img) # numpy array

# 圖像ROI
ball = img[:, :]
img[:, :] = ball

# 類型轉換
img.astype(np.float32)

# 計算耗時
e1 = cv2.getTickCount()
# your code execution
e2 = cv2.getTickCount()
time = (e2 - e1)/ cv2.getTickFrequency()
           

1.5 圖像算術運算

# 圖像加法
dst=cv2.add(img,img)

# 圖像混合
dst = cv2.addWeighted(img,,img,,)

# 按位操作
cv2.bitwise_not()
cv2.bitwise_and()
cv2.bitwise_or()
cv2.bitwise_xor()
           

1.6 門檻值處理

# 簡單的門檻值
ret,dst = cv2.threshold(img,np.mean(img)*,np.max(img),cv2.THRESH_BINARY)
cv2.THRESH_BINARY
cv2.THRESH_BINARY_INV
cv2.THRESH_TRUNC
cv2.THRESH_TRUNC
cv2.THRESH_TOZERO_INV

# 自适應門檻值
dst = cv2.adaptiveThreshold(img,,cv2.ADAPTIVE_THRESH_MEAN_C,\
            cv2.THRESH_BINARY,,)

# Otsu's thresholding after Gaussian filtering
blur = cv2.GaussianBlur(img,(,),)
ret3,th3 = cv2.threshold(blur,,,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
           

1.7圖像的幾何變換

# 縮放
dst = cv2.resize(img,None,fx=, fy=, interpolation = cv2.INTER_CUBIC) # h,w放大2倍

height, width = img.shape[:]
dst = cv2.resize(img,(*width, *height), interpolation = cv2.INTER_CUBIC) # h,w放大2倍

# 平移
rows,cols = img.shape[:]
M = np.float32([[,,],[,,]])
dst = cv2.warpAffine(img,M,(cols,rows))

# 旋轉
M = cv2.getRotationMatrix2D((cols/,rows/),,) # 逆時針旋轉90度
dst = cv2.warpAffine(img,M,(cols,rows))

# 仿射變換
pts1 = np.float32([[,],[,],[,]])
pts2 = np.float32([[,],[,],[,]])
M = cv2.getAffineTransform(pts1,pts2)
dst = cv2.warpAffine(img,M,(cols,rows))

# 透視轉換
pts1 = np.float32([[,],[,],[,],[,]])
pts2 = np.float32([[,],[,],[,],[,]])
M = cv2.getPerspectiveTransform(pts1,pts2)
dst = cv2.warpPerspective(img,M,(,))


# 重新映射
map_x=np.zeros(img.shape[:],np.float32)
map_y=np.zeros(img.shape[:],np.float32)

for j in range(img.shape[]):
    for i in range(img.shape[]):

        # 将圖檔縮小一半,并将其顯示在中間:
        if i>img.shape[]* and i<img.shape[]* and j>img.shape[]* and j<img.shape[]*:
            map_x[j,i]=*(i-img.shape[]*)+
            map_y[j,i]=*(j-img.shape[]*)+
        else:
            map_x[j,i]=
            map_y[j,i]=

        # 上下翻轉圖像
        map_x[j,i]=i
        map_y[j,i]=img.shape[]-j

        # # 左右對調
        map_x[j,i]=img.shape[]-i
        map_y[j,i]=j

        # # 結合上下翻轉和左右對調
        map_x[j,i] = img.shape[] - i
        map_y[j,i] = img.shape[] - j

dst=cv2.remap(img, map_x, map_y, cv2.INTER_LINEAR,None, cv2.BORDER_CONSTANT, (, , ))
           

1.8 圖像平滑

# 二維卷積
kernel = np.ones((,),np.float32)/
dst = cv2.filter2D(img,-,kernel)

# 均值濾波
dst=cv2.blur(img,(,))

# 高斯濾波
dst=cv2.GaussianBlur(img,(,),)

# 中值濾波
dst=cv2.medianBlur(img,)

# 雙邊過濾
dst=cv2.bilateralFilter(img,,,)
           

1.9 形态操作

# 腐蝕
kernel = np.ones((,),np.uint8)
dst = cv2.erode(img,kernel,iterations = )

# 膨脹
kernel = np.ones((,),np.uint8)  # 核心
erosion = cv2.erode(img,kernel,iterations = )  # 腐蝕去除噪聲
dst = cv2.dilate(erosion,kernel,iterations = ) # 膨脹恢複原形狀
           

2、C++版

說明:

資料類型:原類型16bit 4波段 (CV_16UC4)(不轉成32float(CV_32FC4)處理 ,轉float32處理完儲存圖像會出現各種問題),直接使用原格式處理,處理完成後儲存成CV_16UC4

2.1繪圖與寫文本

//
    /*畫圖*/
    //Mat dst;//輸出Mat
    line(img, Point(, ), Point(, ), Scalar(, , ), , LINE_8);//畫線
    circle(img, Point(, ), , Scalar(, , ), FILLED, LINE_8);
    ellipse(img,Point(, ),Size(, ),,,,Scalar(, , ),,LINE_AA);
    rectangle(img,Point(,  * w / ),Point(w, w),Scalar(, , ),FILLED,LINE_8);
    fillPoly(img,ppt,npt,,Scalar(, , ), LINE_8);

    putText(img, "Testing text rendering", org, rng.uniform(, ),
        rng.uniform(, )* + , randomColor(rng), rng.uniform(, ), LINE_8);

    /
           

2.2 分割和合并圖像通道

std::vector<cv::Mat> imgMat(St.nbands);
    std::vector<cv::Mat> tempMat(St.nbands);
    cv::split(img, imgMat); //分離通道
    tempMat.at() = (imgMat.at());//BGR-->RGB
    tempMat.at() = (imgMat.at());
    tempMat.at() = (imgMat.at());
    Mat img2;
    cv::merge(tempMat, img2);// 合并通道
    imgMat.clear();
    tempMat.clear();
           

附加類型轉換

2.3 制作邊框圖像

Mat dst;
    int top, bottom, left, right;
    top = (int)(*img.rows); bottom = (int)(*img.rows);
    left = (int)(*img.cols); right = (int)(*img.cols);

    copyMakeBorder(img, dst, , , , , BORDER_CONSTANT, Scalar(, , ));
           

2.4 通路

//img類型為Mat
    //ROI
    Mat D(img, Rect(, , , )); // using a rectangle
    Mat E = img(Range::all(), Range(, )); // using row and column boundaries

    //複制
    Mat F = img.clone();
    Mat G;
    img.copyTo(G);

    img.channels(); //通道數
    img.rows;//行數 ysize
    img.cols;//列數 xsize
    img.data;//擷取img中所有像素值

    CV_Assert(img.depth() == CV_8U);//判斷資料類型


    //通路像素
    img.at<Vec3b>(y, x);
    img.at<Vec3b>(Point(x, y));
    uchar* p = img.ptr();
    p[];

    //修改像素值
    img.at<uchar>(y, x) = ;

    Vec3f intensity = img.at<Vec3f>(y, x);
    float blue = intensity.val[];
    float green = intensity.val[];
    float red = intensity.val[];

    //計算耗時
    double t = (double)getTickCount();
    // do something ...
    t = ((double)getTickCount() - t) / getTickFrequency();
    cout << "Times passed in seconds: " << t << endl;


    //類型資料轉換
    img.convertTo(img,CV_32FC4);
           

2.5 圖像算術運算

beta = ( - alpha);
addWeighted(src1, alpha, src2, beta, , dst);
           

2.6 門檻值處理