区域亮度不同

时间:2016-01-13 09:43:12

标签: c++ opencv image-processing

我将图像划分为彼此相似的不同区域,但其中一个图像的亮度不同,我必须找出哪些区域的亮度不同。

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

下图显示了一个示例:

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

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

估计亮度通道并在0和1之间标准化,您可以使用灰色通道,HSV饱和通道或任何可以代表亮度的通道:

float

Luminance Channel

应用中值滤镜来消除图像中的噪点和黑色瑕疵:

L = mat2gray(mean(image, 3));

Median Filter

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

L_blur = medfilt2(L, [10 10]);

Binary Mask

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

mask = L_blur > graythresh(L_blur);

Final Output

就是这样。

答案 1 :(得分:3)

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

#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;
}

结果:

enter image description here