基于二值图像的图像分割
Image segmentation based on binary image
我有这两张图片,图片1是图片2的二进制文件。
我想从image 2中分割出image 1形状的对象。
image 1 image 2
我研究了几个示例,但其中 none 很有帮助。考虑将图像 2 叠加到图像 1 的白色区域,在条件下使用 copyTo 函数,但我确信有更好的方法。如果有人能告诉我解决此问题的方法或 C++ 代码片段,我将不胜感激!
您需要 Otsu 阈值来分离前景和背景
/**@file
Get the Otusu threshold for image segmentation.
@param[in] gray - the grayscale image
@param width - image width
@param height - image height
@returns Threshold at which to split pixels into foreground and
background.
@image html maggie.jpg Margaret Thatcher (1925-2013) greyscale photograph
@image html maggieotsu.gif Mrs Thatcher Otsu thresholded
*/
int getOtsuthreshold(unsigned char *grey, int width, int height)
{
int hist[256] = {0};
int wB = 0;
int wF;
float mB, mF;
float sum = 0;
float sumB = 0;
float varBetween;
float varMax = 0.0f;
int answer = 0;
int i;
int k;
for(i=0;i<width*height;i++)
hist[grey[i]]++;
/* sum of all (for means) */
for (k=0 ; k<256 ; k++)
sum += k * hist[k];
for(k=0;k<256;k++)
{
wB += hist[k];
if (wB == 0)
continue;
wF = width*height - wB;
if (wF == 0)
break;
sumB += (float) (k * hist[k]);
mB = sumB / wB; /* Mean Background */
mF = (sum - sumB) / wF; /* Mean Foreground */
/* Calculate Between Class Variance */
varBetween = (float)wB * (float)wF * (mB - mF) * (mB - mF);
/* Check if new maximum found */
if (varBetween > varMax)
{
varMax = varBetween;
answer = k;
}
}
return answer;
}
是的,你是对的。
如前所述,您可以执行图像 masking 而不是在 C++ 中使用 copying:
cv::bitwise_and(image1, image2, output);
其中 image1
是蒙版,image2
是原始图像。
另一种对我有用的方法是:
image2.copyTo(image1, image1);
其中 image1
是蒙版,image2
是原始图像。结果如下图:
我有这两张图片,图片1是图片2的二进制文件。
我想从image 2中分割出image 1形状的对象。
image 1 image 2
我研究了几个示例,但其中 none 很有帮助。考虑将图像 2 叠加到图像 1 的白色区域,在条件下使用 copyTo 函数,但我确信有更好的方法。如果有人能告诉我解决此问题的方法或 C++ 代码片段,我将不胜感激!
您需要 Otsu 阈值来分离前景和背景
/**@file
Get the Otusu threshold for image segmentation.
@param[in] gray - the grayscale image
@param width - image width
@param height - image height
@returns Threshold at which to split pixels into foreground and
background.
@image html maggie.jpg Margaret Thatcher (1925-2013) greyscale photograph
@image html maggieotsu.gif Mrs Thatcher Otsu thresholded
*/
int getOtsuthreshold(unsigned char *grey, int width, int height)
{
int hist[256] = {0};
int wB = 0;
int wF;
float mB, mF;
float sum = 0;
float sumB = 0;
float varBetween;
float varMax = 0.0f;
int answer = 0;
int i;
int k;
for(i=0;i<width*height;i++)
hist[grey[i]]++;
/* sum of all (for means) */
for (k=0 ; k<256 ; k++)
sum += k * hist[k];
for(k=0;k<256;k++)
{
wB += hist[k];
if (wB == 0)
continue;
wF = width*height - wB;
if (wF == 0)
break;
sumB += (float) (k * hist[k]);
mB = sumB / wB; /* Mean Background */
mF = (sum - sumB) / wF; /* Mean Foreground */
/* Calculate Between Class Variance */
varBetween = (float)wB * (float)wF * (mB - mF) * (mB - mF);
/* Check if new maximum found */
if (varBetween > varMax)
{
varMax = varBetween;
answer = k;
}
}
return answer;
}
是的,你是对的。
如前所述,您可以执行图像 masking 而不是在 C++ 中使用 copying:
cv::bitwise_and(image1, image2, output);
其中 image1
是蒙版,image2
是原始图像。
另一种对我有用的方法是:
image2.copyTo(image1, image1);
其中 image1
是蒙版,image2
是原始图像。结果如下图: