个人博客:https://www.whoiscaesarbao.com/2019/03/10/OpenCV-Learning-Day-1
#include
#include
#include
#include
using namespace cv;
using namespace std;
int main(){
Mat srcImage = imread("Phone.png");
imshow("former",srcImage);
Mat element = getStructuringElement(MORPH_RECT,Size(15,15));
Mat dstImage;
erode(srcImage,dstImage,element);
imshow("later",dstImage);
waitKey(0);
return 0;
}
1.imread函数只能读取绝对路径,不能读取相对路径,存在疑问。
已解决:cmake编译时出现问题,需在CMakeLists.txt中加入一行
aux_source_directory(. DIR_SRCS)
对整个文件夹进行扫描即可读取到图片的相对路径。
(Xcode肯定没这问题但是我不想用哈哈~谁叫它长得没有VS Code好看)
2.getStructuringElement
函数原型:
Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));
函数的第一个参数表示内核的形状,有三种形状可以选择。
矩形:MORPH_RECT;
交叉形:MORPH_CORSS;
椭圆形:MORPH_ELLIPSE;
第二和第三个参数分别是内核的尺寸以及锚点的位置。一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移。
3.erode 图像腐蚀(dilate 图像膨胀)
erode 函数原型:
void erode( const Mat& src, Mat& dst, const Mat& element,Point anchor=Point(-1,-1), int iterations=1,int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() );
dilate 函数原型:
void dilate( const Mat& src, Mat& dst, const Mat& element,Point anchor=Point(-1,-1), int iterations=1,int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() );
参数:
src: 原图像。
dst:目标图像。
element:腐蚀操作的内核。 如果不指定,默认为一个简单的 3x3 矩阵。否则,我们就要明确指定它的形状,可以使用函数getStructuringElement().
anchor:默认为Point(-1,-1),内核中心点。省略时为默认值。
iterations:腐蚀次数。省略时为默认值1。
borderType:推断边缘类型,具体参见borderInterpolate函数。默认为BORDER_DEFAULT,省略时为默认值。
borderValue:边缘值,具体可参见createMorphoogyFilter函数。可省略。
#include
#include
#include
#include
using namespace cv;
using namespace std;
int main(){
Mat srcImage = imread("Phone.png");
imshow("src",srcImage);
Mat dstImage;
blur(srcImage,dstImage,Size(7,7));
imshow("dst",dstImage);
waitKey(0);
}
均值滤波是一种典型的线性滤波算法,主要是利用像素点邻域的像素值来计算像素点的值。其具体方法是首先给出一个滤波模板kernel,该模板将覆盖像素点周围的其他邻域像素点,去掉像素本身,将其邻域像素点相加然后取平均值即为该像素点的新的像素值,这就是均值滤波的本质。
函数原型:
void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT);
参数解释:
InputArray src: 输入图像
OutputArray dst: 输出图像
Size ksize: 滤波模板kernel的尺寸,如Size(3,3)
Point anchor=Point(-1, -1): 字面意思是锚点,也就是处理的像素位于kernel的什么位置,默认值为(-1, -1)即位于kernel中心点,如果没有特殊需要则不需要更改
int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT
#include
#include
#include
#include
using namespace cv;
using namespace std;
int main(){
Mat srcImage = imread("Phone.png");
//原图像
imshow("src",srcImage);
Mat dstImage,edge,grayImage;
//创建与srcImage同大小和同类型的矩阵
dstImage.create(srcImage.size(),srcImage.type());
//转换成灰度图像
cvtColor(srcImage,grayImage,COLOR_BGR2GRAY);
//使用滤波函数降噪,这里用的是10*10内核
blur(grayImage,edge,Size(10,10));
//运行canny算子
Canny(edge,edge,3,9,3);
//目标图像
imshow("dst",edge);
waitKey(0);
}
1.cvtColor颜色空间转换函数
函数原型:
void cvtColor(
InputArray src, // 输入图像
OutputArray dst, // 输出图像
int code, // 颜色映射码
int dstCn = 0 // 输出的通道数 (0='automatic')
);
cvtColor()支持多种颜色空间之间的转换,目前常见的颜色空间均支持,并且在转换的过程中能够保证数据的类型不变,即转换后的图像的数据类型和位深与源图像一致。
2.canny算法
Canny边缘检测于1986年由JOHN CANNY首次在论文《A Computational Approach to Edge Detection》中提出,就此拉开了Canny边缘检测算法的序幕。Canny边缘检测是从不同视觉对象中提取有用的结构信息并大大减少要处理的数据量的一种技术,目前已广泛应用于各种计算机视觉系统。
函数原型:
void cv::Canny ( InputArray image,
//输入图像,必须为单通道灰度图
OutputArray edges,
//输出图像,为单通道黑白图
double threshold1,
double threshold2,
//第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割,即如果一个像素的梯度大于上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。
int apertureSize = 3,
//第五个参数表示Sobel 算子大小,默认为3即表示一个3*3的矩阵。Sobel 算子与高斯拉普拉斯算子都是常用的边缘算子
bool L2gradient = false
)
阈值的大小比最好为2:1或3:1。