參考: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);