OpenCV学习11——图像形态学操作的应用(提取水平与竖直线)
-
图像的形态学操作是对二值图像进行操作的,首先我们先明确二值图像与灰度图像的区别。
灰度图像:灰度数字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑白两种颜色,灰度图像在黑色与白色之间还有许多级的颜色深度。
二值图像:二值图像(Binary Image)是指将图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白、B&W、单色图像表示二值图像。二值图像是指在图像中,灰度等级只有两种,也就是说,图像中的任何像素不是0就是1,再无其他过渡的灰度值。
-
提取水平与竖直线的原理分析:
提取水平线即将图片中的竖直线去除掉,因而这是一个先腐蚀后膨胀的结果,结构元素应当为一个厚度非常小,具有一定宽度的矩形结构元素 -
实验代码
#include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main() { Mat src,gray_src,bin_src,temp; src = imread("C:/Users/he104/Desktop/hvtest.jpg"); if (src.empty()) { cout << "could not load the image" << endl; return -1; } imshow("orign_image", src); cvtColor(src, gray_src, CV_BGR2GRAY); adaptiveThreshold(~gray_src,bin_src,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,15,-2); /* //提取竖直的 Mat hstructure = getStructuringElement(MORPH_RECT, Size(1,src.cols/16), Point(-1, -1)); morphologyEx(bin_src, temp, CV_MOP_OPEN, hstructure); bitwise_not(temp, temp); imshow("temp", temp); */ //提取水平的 Mat wstructure = getStructuringElement(MORPH_RECT, Size(src.rows / 16, 1), Point(-1, -1)); morphologyEx(bin_src, temp, CV_MOP_OPEN, wstructure); bitwise_not(temp, temp); imshow("temp", temp); waitKey(0); destroyAllWindows(); return 0; }
-
小结:
提取图像形态学操作中的水平线与竖直线其根本原理还是在于图像的腐蚀与膨胀,利用这个原理我们可以 处理一副图像中的噪声