一、图像间的距离变换
三种常用的距离计算方法:
欧式距离这里就不在解释。
街区距离:顾名思义,就类似于城市距离一样,并不是通过两点间的距离,而是我们从一个地点到达另一个地点的路程(横纵坐标差值之和)。
棋盘距离:是两点横纵坐标之差的最大值。
距离变换函数:
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;
}