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