如何区分二值图像和灰度图像?
Posted
技术标签:
【中文标题】如何区分二值图像和灰度图像?【英文标题】:How to differentiate between binary and gray-scale images? 【发布时间】:2017-06-13 12:13:05 【问题描述】:我正在处理灰度图像。我正在寻找一种方法,从那些主要具有灰色像素的图像中过滤出主要具有接近黑色和接近白色像素的图像。
目前,我正在做:
-
应用阈值从灰色像素中过滤黑白像素。
将黑色计数加上白色计数与图像的总像素数进行比较。
有没有其他方法可以解决这个问题?也许是现有的 OpenCV 方法?
编辑这是我对上述内容的实现。
bool isBinary(cv::Mat img)
cv::Mat whites, blacks;
unsigned int count_whites=0, count_blacks=0, count_pixels=0;
// White enough goes to full white (255)
cv::threshold(img, whites, 250, 255, THRESH_BINARY);
// Not black enough goes to full white (255)
cv::threshold(img, blacks, 5, 255, THRESH_BINARY);
cv::MatIterator_<unsigned char> it_whites = whites.begin<unsigned char>(), it_whites_end = whites.end<unsigned char>();
cv::MatIterator_<unsigned char> it_blacks = blacks.begin<unsigned char>();
for (; it_whites != it_whites_end; ++it_whites, ++it_blacks)
unsigned char current_white=*it_whites, current_black=*it_blacks;
// Checking white
if ((int)*it_whites == 255)
count_whites++;
// Checking black
if ((int)*it_blacks == 0)
count_blacks++;
count_pixels++;
// Let's say 80% its predominantly binary for me
return (count_blacks + count_whites) > 0.8*count_pixels;
【问题讨论】:
你好像忘了问问题。 不清楚你在问什么?您的“目前我正在尝试”解决方案失败了吗?工作?错误? 您在 2. 中的方法不起作用吗?这似乎是合理的。 “主要”对您意味着什么,由您决定。也许这对你来说很有趣:***.com/questions/24716932/… 1- 计算包含 255 个 bin 的直方图 2- 计算 bin[0]+bin[254] / sum(bin) 的比率 【参考方案1】:你只需要决定你在做什么。
图像可以是全灰度 - 0-255 范围内的像素,表示大多数数字,全二进制 - 所有像素 0 或 255,具有抗锯齿的二进制 - 像素 0 或 255,边界除外,其中允许中间值, 本质上是二进制 - 大多数值接近 0 或 255 但不完全是 0 或 255。可能还有其他可能性。
查找 Otsu 阈值,这将是一种将图像分离为前景和背景的有用技术。然后决定什么叫“黑白”,什么叫“灰度”。
【讨论】:
黑白大部分像素值接近/等于 0 或 255 的图像。灰度大部分像素值不接近的图像/等于 0 或 255。 所以它只是一个直方图,有点逻辑。大津门槛吧,那就采取两种模式。如果它们超出公差范围,则为灰色。然后在 kmmodes 之外获取超过容差的像素。如果超过,比如说,10%,它是灰色的。所以你需要四个参数:“白色”的容差、“黑色”的容差、“等于模式”的容差和“允许外部模式的百分比”以上是关于如何区分二值图像和灰度图像?的主要内容,如果未能解决你的问题,请参考以下文章
在matlab中如何将灰度图像转化成二值图像??如何再转化回去?
matlab中如何将灰度图转化为二值黑白图像?敬请各位大侠指点!