使用自定义结构元素进行击中击不中变换时发现如下问题:
自定义结构元素如下:
float kernel_data_b[8][8] = {
{0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1},
};
cv::Mat kernel_b = cv::Mat(8, 8, CV_32FC1, &kernel_data_b);
cv::Point center_b = (7, 7); // b结构单元的中心点
关于设置结构元素中心点,原来的代码是这样写的 cv::Point center_b = (7, 7); 就会出现上述问题
但是改成 cv::Point center_b = Point(7, 7); 之后就解决问题了
这是因为在OpenCV中的结构元素默认以左上角为原点进行定义,而不是以中心点为原点(你在代码中使用的是中心点坐标)。因此,在你的自定义结构元素中,第一个像素的实际坐标应该是(0,0),而不是(-3.5,-3.5)。
对于你的结构元素,由于其尺寸为8x8,因此它的中心点坐标实际上应该是(3, 3),而不是(7, 7)。因此,修改你的代码如下:
float kernel_data_b[8][8] = {
{0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1},
};
cv::Mat kernel_b = cv::Mat(8, 8, CV_32FC1, &kernel_data_b);
cv::Point center_b = (3, 3); // b结构单元的中心点
你能给出完整的代码吗?
特别是morphologyEx这个函数参数
二维图像保存在电脑中,大家可以理解为矩阵,一个二维数组,每个位置都会有一个像素值。
读像素,就是获取某个点处的像素值。