opencv图像遍历中出现的问题

本文深入探讨了使用OpenCV在图像遍历时遇到的形变问题,解释了IPLImage对齐方式导致的空像素点填充,以及这种现象如何引起图像偏移。详细分析了图像保存时每4个字节对齐的原理,并通过实例说明了该问题的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

opencv图像遍历中出现的问题

    IplImage * src_id_img,*mask_img;
    uchar *pColor,*pMask;
    int imglen;

    cvNamedWindow("src");
    cvNamedWindow("dest");

    if ((src_id_img = cvLoadImage("9.png")) == NULL)
    {
        printf("can not find\n");
    };
    //原图像的所有像素长度
    imglen = src_id_img->width * src_id_img->height;
    //pcolor指向图像的像素数据
    pColor = (uchar*)src_id_img->imageData;
    //创建和原图像一样大的单通道图像
    mask_img = cvCreateImage(cvGetSize(src_id_img), 8, 1);
    //同pcolor类似
    pMask = (uchar*)mask_img->imageData;

    for (int m = 0; m < imglen; m++)
    {
        *pMask++ = *pColor;//将每个像素的第一个通道的值付给pmask
        pColor += 3;///原图为三通道 指向下一个像素
    }
    cvShowImage("src", src_id_img);
    cvShowImage("dest", mask_img);
    cvWaitKey();
    cvReleaseImage(&mask_img);

在如上代码中,我企图将9.png这幅图片的第一个通道(B)分离出来保存在mask_img中。其结果为:
这里写图片描述
这里写图片描述
发现分离后的图片发生了形变。

这是由于IPLImage对齐方式的影响,导致图片中有为了保持对齐的空像素点。
opencv中图片保存是,每4个字节对齐,如果不是4的整数倍就必须用空字节补齐,所以在IPLImage结构体中,有时候widthstep != width *3(对于8位三通道图像而言),原因就是每一行的最后往往有几个“凑数的像素”,对于上面的程序而言,就忽略了这几个“凑数的像素”,所以图片整体发生了偏移。

举个例子:
一幅8位三通道图像每行有413个像素,那width = 413,正常情况下,一行应该是1239个字节,也就是widthStep应该是1239,但实际widthstep是1240,增加了1个字节进行对齐。如果不考虑这一个字节的话就会发生上面的偏移情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值