形态学操作中,腐蚀和膨胀原理很简单常用语二值图像,可以看做一种广义的‘’卷积‘’操作。
腐蚀(腐蚀黑色像素为例):
一副二值图像,遍历窗口和卷积核‘’卷积‘’所得值为图像再赋值,其中的‘’卷积‘’规则为遍历窗口各个位置上的黑色像素排布至少有卷积核黑色像素排布则卷积值即窗口中心重新赋值为黑,否则为白。遍历窗口移动直至整副图像遍历完成,卷积值组成的图像就是腐蚀处理之后的图像。(所谓A黑色素排布中至少有B黑色素排布是说:A中任意一个是黑的位置,则B中对该位置也为黑)
膨胀(膨胀黑色像素为例):
一副二值图像,遍历窗口和卷积核‘’卷积‘’所得值为图像再赋值,其中的‘’卷积‘’规则为如果遍历窗口中心位置上的像素和卷积核中心位置处值为同值则卷积核中所有黑色位置对应遍历窗口相应位置重新赋值为黑色。遍历窗口移动直至整副图像遍历完成。
一副正常的图片转化为二值图片后进行腐蚀:
void test_etch()
{
Mat src = imread("d:/2.jpg", 0);
Mat dst(src.rows, src.cols, CV_8UC1);
Mat value2(src.rows, src.cols, CV_8UC1);
for (int i = 0; i < src.rows; i++)
{
uchar* s= src.ptr<uchar>(i);
uchar* v = value2.ptr<uchar>(i);
for (int j = 0; j < src.cols; j++)
{
v[j]=s[j]>70?0:255;
}
}
imshow("二值化图片", value2);
for (int i = 1; i < src.rows - 1; i++)
{
uchar* src_prev = src.ptr<uchar>(i - 1);
uchar* src_cur = src.ptr<uchar>(i);
uchar* src_next = src.ptr<uchar>(i + 1);
uchar* dst_cur = dst.ptr<uchar>(i);
for (int j = 1; j < src.cols - 1; j++)
{
bool rel = src_prev[j] > 70 && src_cur[j] > 70 && src_cur[j - 1] > 70 && src_cur[j + 1] > 70 && src_next[j] > 70;
if (!rel)//上下左右四像素全为黑该像素才可为黑
dst_cur[j] = 255;
else dst_cur[j] = 0;
}
}
imshow("腐蚀黑色区域之后", dst);
waitKey();
}