一、图像间的距离变换
三种常用的距离计算方法:
欧式距离这里就不在解释。
街区距离:顾名思义,就类似于城市距离一样,并不是通过两点间的距离,而是我们从一个地点到达另一个地点的路程(横纵坐标差值之和)。
棋盘距离:是两点横纵坐标之差的最大值。
距离变换函数:
distanceTransform(InputArray src, OutputArray dst,int distanceType, int maskSize, int dstType = cv_32F)
src:输入图像,数据类型为CV_8U的单通道图像。
dst:输出图像,与输入图像具有相同的尺寸,数据类型为CV_8U或者CV_32F的单通道图像。
distanceType:选择计算两个像素之间距离方法的标志。
maskSize:距离变换掩码矩阵大小,可以选择尺寸为DIST_MASK_3(3×3)、DIST_MASK_5 (5×5)
dstType:输出图像的数据类型,可以是CV_8U或者CV_32F。
应用案例如下:
int main() {//定义一个建议矩阵,用于演示Mat a = (Mat_<uchar>(5, 5) << 1, 1, 1, 1, 1,1, 1, 1, 1, 11,1, 1, 0, 1, 1,1, 1, 1, 1, 1,1, 1, 1, 1, 1);Mat dist_L1, dist_L2, dist_C, dist_L12;//计算街区距离distanceTransform(a, dist_L1, 1, 3, CV_8U);cout << dist_L1 << endl;//计算欧式距离distanceTransform(a, dist_L2, 2, 5, CV_8U);cout << dist_L2 << endl;//计算棋盘距离distanceTransform(a, dist_C, 3, 5, CV_8U);cout << dist_C << endl;//对图像进行距离变换//读取图片Mat src = imread("图片1.png", IMREAD_GRAYSCALE);if (src.empty()){printf("不能打开空图片");return -1;}Mat src_BW, srcBW_INV;//将图像转化为二值图像,同时把黑白区域颜色互换threshold(src, src_BW, 50, 255, THRESH_BINARY);threshold(src, srcBW_INV, 50, 255, THRESH_BINARY_INV);//根据距离变换进行距离计算Mat dist, dist_INV;//CV_32F可以使图像变的更清晰distanceTransform(src_BW, dist, 1, 3, CV_32F);distanceTransform(srcBW_INV, dist_INV, 1, 3, CV_8U);imshow("w", src_BW);waitKey(0); return 0;
}
二、图像形态学——腐蚀操作
图像腐蚀原理:
将结构元素的中心点放置在非零像素中,如果结构元素覆盖的范围存在零像素。则删除此时结构元素中心点所在位置元素,再进行平移操作,以此类图。
函数接口:
getStructuringElement(int shape, Size ksize, Point anchor = point(-1,-1))
shape:结构元素的种类。
ksize:结构元素的尺寸大小
anchor:中心点的位置,默认参数为结构元素的几何中心点。
函数生成的结构元素如下:
图像腐蚀操作函数:
erode(lnputArray src, OutputArray dst, lnputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar & borderValue = morphologyDefaultBordervalue())
src:输入的待腐蚀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
dst:腐蚀后的输出图像,与输入图像src具有相同的尺办和数据类型。
kernel:用于腐蚀操作的结构元素,可以自己输入,也可以用getStructuringElement()函数生成。anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点。
iterations:腐蚀的次数。
borderType:像素外推法选择标志。
borderValue:边界不变的边界值。
图像腐蚀操作案例:
int main() {//读取图片Mat src = imread("图片1.png", IMREAD_ANYCOLOR);if (src.empty()){printf("不能打开空图片");return -1;}Mat erode_black1, erode_black2;//开始图像腐蚀操作//定义结构元素Mat struct1, struct2;//3*3大小的矩形结构元素struct1 = getStructuringElement(0, Size(3, 3));//3*3大小的十字结构元素struct1 = getStructuringElement(1, Size(3, 3));//腐蚀操作erode(src, erode_black1, struct1);erode(src, erode_black2, struct2);imshow("w", erode_black1);imshow("q", erode_black2);waitKey(0);return 0;
}
三、图像形态学——膨胀操作
与图像腐蚀相反,这里就不再赘述。
结构元素生成函数:
getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1)
shape:结构元素的种类。
ksize:结构元素的尺寸大小
anchor:中心点的位置,默认参数为结构元素的几何中心点。
图像膨胀操作函数:
dilate(lnputArray src, OutputArray dst, lnputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_cONSTANT, const Scalar & borderValue = morphologyDefaultBordervalue())
src:输入的待膨胀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_160,cV_16S,cV_32F或CV_64F之一。
dst:腐蚀后的输出图像,与输入图像src具有相同的尺寸和数据类型。
kernel:用于膨胀操作的结构元素,可以自己输入,也可以用getStructuringElement()函数生成。anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点。
iterations:腐蚀的次数。
borderType:像素外推法选择标志。
borderValue:边界不变的边界值。
膨胀函数的使用案例:
int main() {//读取图片Mat src = imread("图片1.png", IMREAD_ANYCOLOR);if (src.empty()){printf("不能打开空图片");return -1;}Mat erode_black1, erode_black2;//开始图像腐蚀操作//定义结构元素Mat struct1, struct2;//3*3大小的矩形结构元素struct1 = getStructuringElement(0, Size(3, 3));//3*3大小的十字结构元素struct1 = getStructuringElement(1, Size(3, 3));//膨胀操作dilate(src, erode_black1, struct1);dilate(src, erode_black2, struct2);imshow("w", erode_black1);imshow("q", erode_black2);waitKey(0);return 0;
}