此贴仅用于记录数字图像处理实验中用到的函数和写过的代码,防止丢失。
一 基本操作
一,图像的读入,显示和保存
Mat img;
//文件读取
img = imread("文件路径");
//文件显示
imshow("窗口名",img);
//文件保存
imwrite("文件路径",img);
二,图像创建和灰度化
//创建图像
//1
Mat src = Mat(224, 224, CV_8UC3, Scalar(0, 0, 0));
//2
Mat src;
src.creat(224, 224, CV_8UC3, Scalar(0, 0, 0));//创建3通道的,8位,使用0填充
//灰度化图像
cvtColor(src,dst, COLOR_BGR2GRAY);
//直方图均衡化
equalizeHist(src,dst);
二 点处理
三,绘制直方图
Mat showHist(Mat img) {
Mat hist;
const int channels[1] = { 0 };
float inRanges[2] = { 0,255 };
const float* ranges[1] = { inRanges };
const int bins[1] = { 256 };//0-255
calcHist(&img, 1, channels, Mat(), hist, 1, bins, ranges);
//绘制直方图
int hist_w = 512;
int hist_h = 400; //直方图大小
int width = 2;
Mat histImage = Mat::zeros(hist_h, hist_w, CV_8UC3);
for (int i = 1; i <= hist.rows; i++) {
rectangle(histImage, Point(width * (i - 1), hist_h - 1),
Point(width * i - 1, hist_h - cvRound(hist.at<float>(i - 1) / 20)),
Scalar(255, 255, 255), -1);
}
return histImage;
}
四,图像滤波
//定义模板大小
#define N 5
//均值滤波(邻域平滑)
//第三个参数为核大小,注意两者区别
blur(img, dst1, Size(N, N));
//中值滤波
medianBlur(img,dst2, N);
五,图像锐化
//锐化就是原始图像和高通图像相加
//Sobel算子
void my_sobel(Mat img) {
Mat dstx, dsty;
Sobel(img, dstx, -1, 1, 0);
Sobel(img, dsty, -1, 0, 1);
//第三个值-1表示和源图像depth相同,后两个参数代表不同方向
dstx = abs(dstx);
dsty = abs(dsty);
Mat out;
//得到梯度图像
add(dstx, dsty, out);
//得到锐化图像
add(out, img, out);
imshow("原始图像", img);
imshow("Sobel算子", out);
}
//Prewitt算子
void my_Prewitt(Mat img) {
//定义卷积模板
Mat k1 = (Mat_<double>(3, 3) << 1, 1,1,0,0,0,-1,-1,-1);
Mat k2 = (Mat_<double>(3, 3) << -1,0,1,-1,0,1,-1,0,1);
Mat dst1, dst2;
//卷积,第三个参数意义如上
filter2D(img, dst1, -1, k1);
filter2D(img, dst2, -1, k2);
Mat out;
//得到梯度图像
add(abs(dst1), abs(dst2), out);
//锐化图像
add(img, out, out);
imshow("原始图像", img);
imshow("Prewitt算子", out);
}
//拉普拉斯算子
void my_lap(Mat img) {
//拉普拉斯算子会加强噪声,先滤波
medianBlur(img, img, 3);
Mat out;
//第三个参数意义如上,第四个代表核大小,同中值滤波
Laplacian(img, out, -1, 3);
add(img, out, out);
imshow("原始图像", img);
imshow("拉普拉斯算子", out);
}
六,伪彩色处理
//第三个参数为颜色图模式
applyColorMap(src,dst, COLORMAP_HSV);