首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同亮度区域

不同亮度区域
EN

Stack Overflow用户
提问于 2016-01-13 09:43:11
回答 2查看 399关注 0票数 4

我有一个图像划分在不同的区域相似,但其中一个有不同的亮度,我必须找出这些区域有不同的亮度。

我在我的OpenCV程序中使用C++库。我把我的图像从RGB转换为HSV空间颜色。然后,我测量了每个区域的全球平均值,但它似乎没有我想象的那么强劲。

下面的图像显示了一个示例:

有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-13 15:16:19

对不起,答案是使用Matlab,但是这种方法应该很容易在C++中实现。

估计亮度通道并将其归一化在0到1之间,您可以使用灰度通道、HSV的饱和通道或任何可以表示亮度的东西:

代码语言:javascript
复制
L = mat2gray(mean(image, 3));

应用中值滤波器去除图像中的噪声和黑色伪影:

代码语言:javascript
复制
L_blur = medfilt2(L, [10 10]);

使用Otsu的阈值计算阈值并应用于图像。这样就可以将直方图分成两部分,将更亮和更暗的区域分隔开来:

代码语言:javascript
复制
mask = L_blur > graythresh(L_blur);

然后使用生成的二进制掩码使用简单的元素分组乘法来分割图像:

代码语言:javascript
复制
output = uint8(repmat(mask, [1 1 3])) .* image;

就这样。

票数 4
EN

Stack Overflow用户

发布于 2016-01-13 15:36:03

这是@Eliezer的OpenCV的great answer端口,只是为了完整。

代码语言:javascript
复制
#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
    Mat3b img = imread("path_to_image");

    // Estimate Luminance Channel

    Mat1b L(img.rows, img.cols, uchar(0));
    for (int r = 0; r < img.rows; ++r)
    {
        for (int c = 0; c < img.cols; ++c)
        {
            Vec3b v = img(r,c);
            L(r, c) = saturate_cast<uchar>((float(v[0]) + float(v[1]) + float(v[2])) / 3.f);
        }
    }

    // Apply a Median Filter
    Mat1b L_blur;
    medianBlur(L, L_blur, 11);

    // Use OTSU threshold
    Mat1b mask;
    threshold(L_blur, mask, 0, 255, THRESH_BINARY | THRESH_OTSU);

    // Segment image
    Mat3b output(img.rows, img.cols, Vec3b(0,0,0));
    img.copyTo(output, mask);


    imshow("Result", output);
    waitKey();

    return 0;
}

结果:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34763152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档