我正在尝试实现一种在不使用opencv中内置侵蚀功能的情况下侵蚀图片的功能。
我的方法是检查图像区域中是否有0,并且如果内核为1,则无法设置1,这意味着条件为假。 然后,我的第二个if语句表示条件为true,则设置了我的1。
void erosion(const cv::Mat& image, cv::Mat& erosion_image, const cv::Mat& kernel)
{
bool check;
int count;
int count_2;
int anchorx = kernel.rows / (2.0);
int anchory = kernel.cols / (2.0);
for (int x = 0; x < image.rows; x++) {
for (int y = 0; y < image.cols; y++) {
kernel.at<uchar>(x, y);
for (int count = 0; count < kernel.rows; count++) {
for (int count_2 = 0; count_2 < kernel.cols; count_2++) {
if (image.at<uchar>(x + count, y + count_2) == 0 && kernel.at<uchar>(count, count_2) == 1) {
check = false;
}
}
}
if (check) {
erosion_image.at<uchar>(x, y) = 1;
}
}
}
}
这是正确的方法吗? 预先谢谢你
答案 0 :(得分:0)
这是二进制图像腐蚀的定义。如果处理灰度图像,则应将像素值设置为其附近Wiki-Erosion的点的最小值。
在以下代码中,我使用的不是255的最大像素值,而是255-CV_8U图像类型的OpenCV最大值的默认值。
注意,您还需要选择如何处理图像的边界像素。在下面的代码中,它们只是未处理。 二进制图像的侵蚀可以表示为如下形式:
void erosion(const cv::Mat& image, cv::Mat& erosion_image, const cv::Mat& kernel)
{
bool check;
int count;
int count_2;
int anchorx = kernel.rows / (2.0);
int anchory = kernel.cols / (2.0);
for (int x = anchorx; x < image.rows - anchorx; x++) {
for (int y = anchory; y < image.cols - anchory; y++) {
check = true;
if (image.at<uchar>(x, y))
{
for (int count = 0; count < kernel.rows && check; count++) {
for (int count_2 = 0; count_2 < kernel.cols && check; count_2++) {
if (image.at<uchar>(x - anchorx + count, y - anchory + count_2) == 0 &&
kernel.at<uchar>(count, count_2) == 1) {
erosion_image.at<uchar>(x, y) = 0;
check = false;
}
}
}
if (check)
erosion_image.at<uchar>(x, y) = 255;
}
else
erosion_image.at<uchar>(x, y) = 0;
}
}
}