形态学操作简例
利用简单实例了解形态学操作的玩具级应用。
二值图像
RGB2GRAY
cvtColor()格式转换
源图像转换为灰度图,目的是为了进一步自适应图像二值化。
Mat gray_src;
cvtColor(src, gray_src, COLOR_BGR2GRAY);
GRAY 2 BINARY
根据习惯调整灰度图像前景与背景:
imshow("~gray_src", ~gray_src);
imshow("gray_src", gray_src);
API
CV_EXPORTS_W void adaptiveThreshold( InputArray src, OutputArray dst,
double maxValue, int adaptiveMethod,
int thresholdType, int blockSize, double C );
- src 输入图像
- dst 输出图像
- maxvalue 变换后的最大值
- adaptiveMethod 自适应阈值算法 ADAPTIVE_THRESH_MEAN_C 和ADAPTIVE_THRESH_GAUSSIAN_C 分别对应邻域均值和邻域高斯加权值
- thresholdType 邻域大小
- blocksize 阈值算法常量,用于控制最终结果的偏移量 详看自适应阈值化操作:adaptiveThreshold()函数
Mat binimg;
adaptiveThreshold(~gray_src, binimg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
形态学操作
定义一个横长条,对图像进行开操作(先腐蚀后膨胀),可以得到二值图像中对应图像的轮廓。
Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 5, 1), Point(-1, -1));//定义一个宽为src.cols / 5,高为1的长矩形
Mat tmp;
erode(binimg, tmp, hline);//复习腐蚀和膨胀api 没有选择直接调用morphologyEx()
dilate(tmp, dst, hline);
imshow("tmp", tmp);
imshow("dst", dst);
或者一个纵长条
Mat wline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 5), Point(-1, -1));
Mat tmp;
erode(binimg, tmp, wline);
dilate(tmp, dst, wline);
imshow("tmp", tmp);
imshow("dst", dst);
亦可以是别的
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
Mat src, dst;
int main() {
src = imread("5.jpg");
if (!src.data)
{
printf("Wrong with Loading img!\n");
return -1;
}
Mat gray_src;
cvtColor(src, gray_src, COLOR_BGR2GRAY);
Mat binimg;
adaptiveThreshold(~gray_src, binimg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 5, 1), Point(-1, -1));
Mat wline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 5), Point(-1, -1));
Mat kernel = getStructuringElement(MORPH_RECT, Size(5 , 5), Point(-1, -1));//定义一个正方形的结构
Mat tmp;
erode(binimg, tmp, kernel);
dilate(tmp, dst, kernel);
blur(dst, dst, Size(3, 3), Size(-1, -1));//均值滤波 更圆润
bitwise_not(dst, dst);//等价于~dst 第一次用:https://blog.csdn.net/m0_56838271/article/details/127140543?spm=1001.2014.3001.5502
imshow("input", src);
imshow("dst", dst);
waitKey(0);
return 0;
}