一:形态学操作
形态学通常表示生物学的一个分支,在图像处理中的形态学,往往是指数学形态学,两种最基本的形态学操作:膨胀(dilate)和腐蚀(erode)
形态学操作可以消除噪声,分割(isolate)独立的图像元素,寻找图像中明显的极大值区域和极小值区域以及求出图像梯度等。
C++与OpenCV代码如下:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
Mat src, dst;
int main()
{
Mat src = imread("F:/openCV/girl.png");
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
Mat s = getStructuringElement(MORPH_RECT, Size(7, 7), Point(-1, -1));
//dilate(src, dst, s);
erode(src, dst, s);
namedWindow("output", CV_WINDOW_AUTOSIZE);
imshow("output", dst);
waitKey(0);
return 0;
}
二:线性滤波
滤波处理是图像处理中比较常用的方法,也称模糊处理(bluring),用来减少图像上的噪声或者失真,滤波指在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可或缺的操作,其处理效果的好坏直接影响到后续图像处理和分析的有效性和可靠性。
基本代码如下:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{
Mat src,dst,dst1,dst2,dst3;
src = imread("F:/openCV/girl.png");
namedWindow("input", CV_WINDOW_AUTOSIZE);
namedWindow("output", CV_WINDOW_AUTOSIZE);
blur(src, dst, Size(3,3), Point(-1,-1));//均值模糊,point默认为中间值
medianBlur(src, dst1, 3);//中值模糊,取平均值,3为卷积核的半径
bilateralFilter(src, dst2, 15, 150, 10);//双边模糊,15是半径。150是颜色,10是参数
GaussianBlur(src, dst3, Size(15, 15), 3, 3);//高斯模糊,后面是参数sigmaX,Y,是参数
imshow("input", src);
imshow("junzhi", dst);
imshow("output", dst1);
imshow("other window", dst2);
imshow("gaosi", dst3);
waitKey(0);
return 0;
}
三:设置滑动条
createTrackbar函数用于创建一个可以调整数值的滑动条(常常也被称作轨迹条),并将滑动条附加到指定的窗口上,使用起来很方便。函数原型如下:
int creatrTrackbar(conststring&trackbarname, conststring&winname, int* value, int count, TrackbarCallback onChange=0,void* userdata=0);
第一个参数,轨迹条的名字,用来代表我们创建的轨迹条。
第二个参数,窗口的名字,表示这个轨迹条会依附到哪个窗口上,即对应namedWindow()创建窗口时填的某个窗口名。
第三个参数,int类型的value,一个指向整型的指针,表示滑块的位置。在创建时,滑块的初始位置就是该变量当前的值。
第四个参数,表示滑块可以达到的最大位置的值。滑块最小位置的值始终为0。
第五个参数,TrackbarCallback类型的onChange,默认值0.这是个指向回调函数的指针,每次滑动块位置改变时,这个函数都会进行回调。
第六个参数,void类型的userdata,也有默认值0。
具体例子见代码:
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void on_ContrastAndBright(int, void *);
int alpha;
int bata;
Mat src;
Mat dst = Mat::zeros(src.size(), src.type());
int main()
{
src = imread("F:/openCV/girl.png");
alpha = 0;
bata = 0;
namedWindow("input", CV_WINDOW_AUTOSIZE);
namedWindow("output", CV_WINDOW_AUTOSIZE);
createTrackbar("对比度:", "output", &alpha, 300, on_ContrastAndBright);
createTrackbar("亮度:", "output", &bata, 200, on_ContrastAndBright);
on_ContrastAndBright(alpha, 0);
on_ContrastAndBright(bata, 0);
imshow("input", src);
imshow("output", dst);
waitKey(0);
return 0;
}
void on_ContrastAndBright(int, void *)
{
for (int y = 0; y < src.rows; y++)
{
for (int x = 0; x < src.cols; x++)
{
for (int c = 0; c < 3; c++)
{
float a = src.at<Vec3b>(y, x)[c];
dst.at<Vec3b>(y, x)[c] = saturate_cast<uchar>((alpha*0.01)*a + bata);
waitKey(0);
}
}
}
}