目录
一、Opencv中常用的图像的读取方法
二、形态学操作中核的生成getStructuringElement()函数
三、Opencv中图像的三种二值化:threshold、adaptiveThreshold、Otsu 二值化
四、图像模糊均值滤波Blur()函数
一、Opencv中常用的图像的读取方法
1、直接根据图片路径进行读入
String img_path = "C:/Users/maker/Pictures/website/img1.png";
img = imread(img_path,1);
上面关于路径的书写有几种方法:
1)双右斜线:String img_path = "C:\\Users\\maker\\Pictures\\website\\img1.png";
2)双左斜线:String img_path = "C://Users/maker//Pictures//website//img1.png";
3)单左斜线:String img_path = "C:/Users/maker/Pictures/website/img1.png";
2、命令行参数法读取图片
string img_path = argv[1];
img = imread(img_path,1);
或者直接写成img = imread(argv[1],1);
这种方法需要设置一下,工程——属性——配置属性——调试——命令行参数,然后设置就行了。如图:
设置之后img1.png就是argv[1],img2.png就是argv[2] .
二、形态学操作中核的生成getStructuringElement()函数
图像处理经常要用到形态学操作,其中首先要获取 结构元素。包括结构元素的大小及形状。
Opencv中函数getStructuringElement()可以生成形态学操作中用到的核,函数定义“结构元素”的形状:矩形(包括线形)、椭圆(包括圆形)及十字形,MORPH_RECT, MORPH_ELLIPSE, MORPH_CROSS
形态学各种功能实现,都归结为腐蚀erode与膨胀dilate的组合。所以,接口函数morphologyEx的内部实现都是调用erode与dilate函数。
Opencv中函数getStructuringElement()可以生成形态学操作中用到的核,函数原型:
Mat getStructuringElement(int shape, //核的形状 0:矩形 1:十字交叉形 2: 椭圆
Size ksize,//核大小
Point anchor=Point(-1,-1) //核中心位置,默认位于形状中心处
);
矩形、十字交叉形和椭圆形的区别可以通过输出矩阵对比一下:#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
int main(int argc,char *argv[])
{
Mat elementRect,elementCross,elementEllipse;
elementRect=getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
elementCross=getStructuringElement(MORPH_CROSS,Size(3,3),Point(-1,-1));
elementEllipse=getStructuringElement(MORPH_ELLIPSE,Size(3,5),Point(-1,-1));
std::cout<<"3*3矩形核:"<<std::endl<<elementRect<<std::endl;
std::cout<<"3*3十字叉形核:"<<std::endl<<elementCross<<std::endl;
std::cout<<"3*3椭圆形核:"<<std::endl<<elementEllipse<<std::endl;
system("pause");
}
形态学操作中的膨胀和腐蚀的概念是针对图像中高亮区域而言的(二值图像中对应像素值255,白色),变大和缩小也是针对图像中高亮的部分,所以对图像执行膨胀,对高亮区域是胀大,面积增大,对暗区域相当于是腐蚀,面积缩小。
详细参考:
三、Opencv中图像的三种二值化:threshold、adaptiveThreshold、Otsu 二值化
阈值化操作在图像处理中是一种常用的算法,比如图像的二值化就是一种最常见的一种阈值化操作。opencv2和opencv3中提供了直接阈值化操作cv::threshold()和自适应阈值化操作cv::adaptiveThreshold()两种阈值化操作接口,这里将对这两个接口进行介绍和对比。
1、直接阈值化——cv::threshold()
阈值化操作的基本思想是,给定一个输入数组和一个阈值,数组中的每个元素将根据其与阈值之间的大小发生相应的改变。
固定阈值二值化,threshold(src, dst,thresh, maxval, type)
- src: 输入图,只能输入单通道图像,通常来说为灰度图
- dst: 输出图
- thresh: 阈值
- maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
- type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
2、adaptiveThreshold:自适应阈值二值化
自适应阈值二值化函数根据图片一小块区域的值来计算对应区域的阈值,从而得到也许更为合适的图片。
adaptiveThreshold(src, dst,maxval, thresh_type, type, Block Size, C)
- src: 输入图,只能输入单通道图像,通常来说为灰度图
- dst: 输出图
- maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
- thresh_type: 阈值的计算方法,包含以下2种类型:cv2.ADAPTIVE_THRESH_MEAN_C; cv2.ADAPTIVE_THRESH_GAUSSIAN_C.
- type:二值化操作的类型,与固定阈值函数相同,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV.
- Block Size: 图片中分块的大小
- C :阈值计算方法中的常数项
3、Otsu’s Binarization: 基于直方图的二值化
Otsu’s Binarization是一种基于直方图的二值化方法,它需要和threshold函数配合使用。
Otsu过程:
1. 计算图像直方图;
2. 设定一阈值,把直方图强度大于阈值的像素分成一组,把小于阈值的像素分成另外一组;
3. 分别计算两组内的偏移数,并把偏移数相加;
4. 把0~255依照顺序多为阈值,重复1-3的步骤,直到得到最小偏移数,其所对应的值即为结果阈值。
四、图像模糊均值滤波Blur()函数
blur(srcImage, resImage_blur,Size(10,10),Point(-1,-1),4);
src:输入的原图,Mat类对象。该对象可以使任意通道的
dst:输出的图像
Size():图像处理卷积核的大小,可以理解为模糊处理的深度,数值越大模糊程度越大
point:卷积核参考点,默认值(-1,-1)
Type:处理的类型,表示对边缘的处理方法,一般默认4表示默认处理方法
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;int main(int argc,char**argv) {
Mat src, dst;
String img_path = "C:\\Users\\maker\\Pictures\\website\\img3.png";
src = imread(img_path,1);
//imshow("srcimage", src);
//src = imread(argv[1], 1);
if (!src.data) {
printf("could not load image..\n");
return -1;
}
char input_win[] = "input_image";
char output_win[] = "output_image";
Mat gray_src;
cvtColor(src, gray_src, CV_BGR2GRAY);
//imshow("gray_imgage", gray_src);
Mat binary_src;
adaptiveThreshold(~gray_src, binary_src, 255, ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,15,-2);
imshow("binary_image", binary_src);
//水平结构元素
Mat hline = getStructuringElement(MORPH_RECT,Size(src.cols/16,1),Point(-1,-1));
//垂直结构元素
Mat vline = getStructuringElement(MORPH_RECT,Size(1,src.rows/16),Point(-1,-1));
//矩形结构元素
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1)); Mat temp;
erode(binary_src, temp, kernel);
dilate(temp,dst,kernel);
//morphologyEx(binary_src, dst,CV_MOP_OPEN,vline ); //等价于上面两句 bitwise_not(dst, dst);
//blur(dst,dst, Size(3, 3), Point(-1, -1));
//imshow("temp", temp);
imshow("final result", dst); waitKey(0);
return 0;
}