形态学,验证码,提取水平线,上、降采样
1. 形态学操作
morphologyEx
腐蚀:erode 取最小值
膨胀:dilate 取最大值
- MORPH_OPEN 开:先腐蚀后膨胀
- MORPH_CLOSE 闭:先膨胀后腐蚀
- MORPH_GRADIENT 梯度:膨胀 - 腐蚀
- MORPH_TOPHAT 顶帽:原图像 - 开图像
- MORPH_BLACKHAT 黑帽:闭图像 - 原图像
int main(){
Mat src = imread("E:/copy.png");
if (!src.data){
cout << "imread error" << endl;
return -1;
}
imshow("src", src);
Mat kernel = getStructuringElement(MORPH_RECT,Size(25,25));
Mat dst;
// 腐蚀
// erode(src, dst, kernel);
// 膨胀
//dilate(src,dst,kernel);
// MORPH_OPEN 开:先腐蚀后膨胀
// morphologyEx(src, dst,MORPH_OPEN,kernel);
// MORPH_CLOSE 闭:先膨胀后腐蚀
// morphologyEx(src,dst,MORPH_CLOSE,kernel);
// MORPH_GRADIENT 梯度:膨胀 - 腐蚀
//morphologyEx(src, dst, MORPH_GRADIENT, kernel);
// MORPH_TOPHAT 顶帽:原图像 - 开图像
// morphologyEx(src,dst,MORPH_TOPHAT,kernel);
// MORPH_BLACKHAT 黑帽:闭图像 - 原图像
morphologyEx(src,dst,MORPH_BLACKHAT,kernel);
imshow("dst",dst);
waitKey(0);
return 0;
}
2. 验证码识别
~ 符号表示 = (255 - 原本的像素值) 等同于 bitwise_not
adaptiveThreshold 二值化, 比如 > 125 的像素 设置为 255, 小于=125 的像素设置为 0
int main(){
Mat src = imread("E:/copy.png");
if (!src.data){
cout << "imread error" << endl;
return -1;
}
imshow("src", src);
// 2.1 把彩色变成 黑白 二值化
// 灰白
Mat gray;
cvtColor(src,gray,COLOR_BGR2GRAY);
// imshow("gray",gray);
// 二值化方法,自动阈值
// ~ 符号表示 = (255 - 原本的像素值) 等同于 bitwise_not
Mat binary;
adaptiveThreshold(~gray,binary,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,15,0);
imshow("binary",binary);
Mat kernel = getStructuringElement(MORPH_RECT,Size(5,5));
Mat dst;
// 腐蚀
erode(src,dst,kernel);
// 膨胀
dilate(src, dst, kernel);
// morphologyEx(src,dst,MORPH_CLOSE,kernel);
bitwise_not(dst, dst);
imshow("dst",dst);
waitKey(0);
return 0;
}
3. 提取水平线
int main(){
Mat src = imread("E:/copy.png");
if (!src.data){
cout << "imread error" << endl;
return -1;
}
imshow("src", src);
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
// imshow("gray",gray);
// 二值化方法,自动阈值
// ~ 符号表示 = (255 - 原本的像素值) 等同于 bitwise_not
Mat binary;
adaptiveThreshold(~gray, binary, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 0);
// 二值化有些小问题,做一下弥补
Mat kernel = getStructuringElement(MORPH_RECT, Size(9, 9));
Mat dst;
dilate(binary, dst, kernel);
erode(dst, dst, kernel);
// 取水平
Mat lLine = getStructuringElement(MORPH_RECT, Size(src.cols/16,1));
erode(dst,dst,lLine);
dilate(dst,dst,lLine);
imshow("dst",dst);
waitKey(0);
return 0;
}
4. 上采样与降采样
图片采样:采样(sampling)也称取样,指把时间域或空间域的连续量转化成离散量的过程。在数字图像处理领域中,定义为图像空间坐标的数字化操作。
- pyrUp 上采样 放大 拉普拉斯:预计算(推算)值
- pyrDown 降采样 缩小 高斯 ,1. 对图像进行高斯模糊,2.再过滤左右临近点
int main(){
Mat src = imread("E:/copy.png");
if (!src.data){
cout << "imread error" << endl;
return -1;
}
imshow("src", src);
Mat dst;
// 上采样 拉普拉斯 双线性插值,预计算(推算)值
// pyrUp(src,dst,Size(src.cols*2,src.rows*2));
// 降采样:1. 对图像进行高斯模糊,2.再过滤左右临近点。 采用的高斯 所以比较慢
pyrDown(src,dst,Size(src.cols/2,src.rows/2));
imshow("dst",dst);
// imwrite("E:/copy_pyrUp.png", dst);
waitKey(0);
return 0;
}