由cvThreshold生成的奇怪的二进制图像值

时间:2010-11-15 02:31:29

标签: opencv

嘿,伙计们,我正在使用opencv进行车辆识别工作,当我使用cvThershold将灰度图像转换为二进制图像时,返回图像真的很奇怪,二进制图像假设只有两个值,0然而,它包含其他值,如2,3,254,253,任何人都知道这是怎么发生的,而且cvCmps也有这个问题。

2 个答案:

答案 0 :(得分:0)

cvThreshold具有超出正常二进制阈值的各种行为。它们在OpenCV API reference中描述。

例如,如果使用标志threshold_type set CV_THRESH_TRUNC调用它,它将仅截断高于指定阈值的所有强度。低于阈值的强度将保持不变。也许这说明了你的奇怪结果?

如果您发布图像和代码(调用cvThreshold的位足够),我可能会提供更多帮助。

答案 1 :(得分:0)

试试这个:

/*
 * compile with:
 *
 * g++ -Wall -ggdb -I. -I/usr/include/opencv -L /usr/lib -lm -lcv -lhighgui -lcvaux threshold.cpp -o threshold.out
 */

#include <cv.h>    
#include <highgui.h>
#include <stdio.h>
#include <assert.h>

IplImage *
threshold(IplImage const *in, int threshold)
{
    assert(in->nChannels == 1);
    CvSize size = cvSize(in->width, in->height);
    IplImage *out = cvCreateImage(size, IPL_DEPTH_8U, 1);
    cvThreshold(in, out, threshold, 255, CV_THRESH_BINARY);

    return out;
}

void
show_image(char const *title, IplImage const *image)
{
    cvNamedWindow(title, CV_WINDOW_AUTOSIZE);
    cvShowImage(title, image);
    cvWaitKey(0);    
    cvDestroyWindow(title);
}

int
main(int argc, char **argv)
{
    if (argc < 2)
    {
        fprintf(stderr, "usage: %s in.png\n", argv[0]);
        return 1;
    }

    IplImage *in = cvLoadImage(argv[1]);
    IplImage *grey = in;

    if (in->nChannels != 1)
    {
        /*
         * For some reason, cvCreateImage returns an image with 3 channels even
         * when a greyscale image is specified (e.g. PGM).  Hack around this by
         * just taking the first channel of the image.  OpenCV uses BGR order,
         * so it will be the B channel.
         */
        CvSize size = cvSize(in->width, in->height);
        grey = cvCreateImage(size, IPL_DEPTH_8U, 1);
        cvSplit(in, grey, NULL, NULL, NULL);
        cvReleaseImage(&in);
    }

    IplImage *thres = threshold(grey, 127);
    show_image("thresholded", thres);
    cvReleaseImage(&thres);

    cvReleaseImage(&grey);
    return 0;
}

给它任何图像(即使是彩色图像,请参阅注释以便澄清),例如[这一个] [1]。你得到了预期的结果吗?

[1]:http://r0k.us/graphics/kodak/kodak/kodim20.png SixShooter