将 floodfill 输出(连接的像素)复制到新的垫子中
Get floodfill outputs (connected pixels) copied into a new mat
有没有一种方便的方法可以从 floodfill
操作的输出创建一个新的 Mat?我只想得到一个像素垫,这些像素被检测为连接到种子像素并且在技术上被洪水填充。
猜猜我对某个种子点执行了floodFill
方法,连接时只填充了总像素的1/4。我只想将这些像素复制到一个新图像中,该图像仅代表那些 1/4 像素数,并且很可能小于原始输入图像。
无论如何,我都是通过一种非常耗时且耗时更多的方法来完成此操作的 cpu。简而言之,我的方法是为不同的 floodfill
调用提供不同的颜色,并在单独的数据结构中记录相同颜色的像素,等等。
我想知道是否有使用 floodfill
创建的蒙版或使用任何其他方法的直接且更简单的方法。
还不完全清楚您到底需要什么。
请看一下这段代码,并检查 croppedResult
是否是您想要的。
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
// Create a test image
Mat1b img(300, 200, uchar(0));
circle(img, Point(150, 200), 30, Scalar(255));
rectangle(img, Rect(30, 50, 40, 20), Scalar(255));
rectangle(img, Rect(100, 80, 30, 40), Scalar(255));
// Seed inside the circle
Point seed(160, 220);
// Setting up a mask with correct dimensions
Mat1b mask;
copyMakeBorder(img, mask, 1, 1, 1, 1, BORDER_CONSTANT, Scalar(0));
Rect roi;
uchar seedColor = 200;
floodFill(img, mask,
seed + Point(1,1), // Since the mask is larger than the filled image, a pixel (x,y) in image corresponds to the pixel (x+1,y+1) in the mask
Scalar(0), // If FLOODFILL_MASK_ONLY is set, the function does not change the image ( newVal is ignored),
&roi, // Minimum bounding rectangle of the repainted domain.
Scalar(5), // loDiff
Scalar(5), // upDiff
4 | (int(seedColor) << 8) | FLOODFILL_MASK_ONLY);
// 4-connected | with defined seedColor | use only the mask
// B/W image, where white pixels are the one set to seedColor by floodFill
Mat1b result = (mask == seedColor);
// Cropped image
roi += Point(1,1);
Mat1b croppedResult = result(roi);
return 0;
}
测试图片img
:
在 floodFill
之后屏蔽 mask
:
遮罩 result
只有 seedColor
像素:
裁剪蒙版 croppedResult
:
更新
// B/W image, where white pixels are the one set to seedColor by floodFill
Mat1b resultMask = (mask == seedColor);
Mat1b resultMaskWithoutBorder = resultMask(Rect(1,1,img.cols,img.rows));
Mat3b originalImage;
cvtColor(img, originalImage, COLOR_GRAY2BGR); // Probably your original image is already 3 channel
Mat3b imgMasked(img.size(), Vec3b(0,0,0));
originalImage.copyTo(imgMasked, resultMaskWithoutBorder);
Mat3b croppedResult = imgMasked(roi);
return 0;
有没有一种方便的方法可以从 floodfill
操作的输出创建一个新的 Mat?我只想得到一个像素垫,这些像素被检测为连接到种子像素并且在技术上被洪水填充。
猜猜我对某个种子点执行了floodFill
方法,连接时只填充了总像素的1/4。我只想将这些像素复制到一个新图像中,该图像仅代表那些 1/4 像素数,并且很可能小于原始输入图像。
无论如何,我都是通过一种非常耗时且耗时更多的方法来完成此操作的 cpu。简而言之,我的方法是为不同的 floodfill
调用提供不同的颜色,并在单独的数据结构中记录相同颜色的像素,等等。
我想知道是否有使用 floodfill
创建的蒙版或使用任何其他方法的直接且更简单的方法。
还不完全清楚您到底需要什么。
请看一下这段代码,并检查 croppedResult
是否是您想要的。
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
// Create a test image
Mat1b img(300, 200, uchar(0));
circle(img, Point(150, 200), 30, Scalar(255));
rectangle(img, Rect(30, 50, 40, 20), Scalar(255));
rectangle(img, Rect(100, 80, 30, 40), Scalar(255));
// Seed inside the circle
Point seed(160, 220);
// Setting up a mask with correct dimensions
Mat1b mask;
copyMakeBorder(img, mask, 1, 1, 1, 1, BORDER_CONSTANT, Scalar(0));
Rect roi;
uchar seedColor = 200;
floodFill(img, mask,
seed + Point(1,1), // Since the mask is larger than the filled image, a pixel (x,y) in image corresponds to the pixel (x+1,y+1) in the mask
Scalar(0), // If FLOODFILL_MASK_ONLY is set, the function does not change the image ( newVal is ignored),
&roi, // Minimum bounding rectangle of the repainted domain.
Scalar(5), // loDiff
Scalar(5), // upDiff
4 | (int(seedColor) << 8) | FLOODFILL_MASK_ONLY);
// 4-connected | with defined seedColor | use only the mask
// B/W image, where white pixels are the one set to seedColor by floodFill
Mat1b result = (mask == seedColor);
// Cropped image
roi += Point(1,1);
Mat1b croppedResult = result(roi);
return 0;
}
测试图片img
:
在 floodFill
之后屏蔽 mask
:
遮罩 result
只有 seedColor
像素:
裁剪蒙版 croppedResult
:
更新
// B/W image, where white pixels are the one set to seedColor by floodFill
Mat1b resultMask = (mask == seedColor);
Mat1b resultMaskWithoutBorder = resultMask(Rect(1,1,img.cols,img.rows));
Mat3b originalImage;
cvtColor(img, originalImage, COLOR_GRAY2BGR); // Probably your original image is already 3 channel
Mat3b imgMasked(img.size(), Vec3b(0,0,0));
originalImage.copyTo(imgMasked, resultMaskWithoutBorder);
Mat3b croppedResult = imgMasked(roi);
return 0;