c – OpenCV中1平面图像的位平面仅适用于图像的1/3

前端之家收集整理的这篇文章主要介绍了c – OpenCV中1平面图像的位平面仅适用于图像的1/3前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试通过自己做一些事来学习OpenCV.在这种特殊情况下,我想拍摄灰度图像的位平面.代码似乎有效,但它只适用于第7位和第6位,而不是其余6位,因为它只显示约1/3图像的良好结果.我还没有发现它有什么问题.我非常感谢有关此问题的一些帮助,因为我只是在编写我的第一个代码库.

这是我得到的第一位:

这是第7位:

这是我的代码

#include <opencv2\opencv.hpp>
#include <math.h>

using namespace cv;
using namespace std;

int main( int argc,char** argv ) {
   Mat m1 = imread("grayscalerose.jpg");
   imshow("Original",m1);
   int cols,rows,x,y;
   cols = m1.cols;
   rows = m1.rows;
   printf("%d %d \n",m1.rows,m1.cols);
   Mat out1(rows,cols,CV_8UC1,Scalar(0));
   out1 = (m1/128); //Here's where I divide by either 1,2,4,8,16,32,64,or 128 to get the corresponding bit planes

   for (int y = 0; y < rows; y++){
        for (int x = 0; x < cols; x++){
            out1.at<uchar>(y,x) = (out1.at<uchar>(y,x) % 2);
   } }

   out1 = out1*255;
   imshow("out1",out1);
   waitKey(0);
   destroyWindow( "out1" );

}

提前致谢.我希望我的解释不是太乱.

解决方法

当您将15(0x00001111)除以2(0x00000010)时,得到7(0x00000111),这不是您所期望的.你可以检查一下是否设置如下:15& 2,如果未设置第二位则产生0,否则产生大于0的值.这同样适用于其他值.

请尝试以下代码.注意:

>您需要将图像加载为灰度(在imread中使用IMREAD_GRAYSCALE)
>选择该位时,可以直接输入0或255的值

码:

#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
    Mat m1 = imread("path_to_image",IMREAD_GRAYSCALE);
    imshow("Original",m1);
    int cols,y;
    cols = m1.cols;
    rows = m1.rows;
    printf("%d %d \n",m1.cols);
    Mat out1(rows,Scalar(0));


    for (int y = 0; y < rows; y++){
        for (int x = 0; x < cols; x++){
            out1.at<uchar>(y,x) = (m1.at<uchar>(y,x) & uchar(64)) ? uchar(255) : uchar(0); //Here's where I AND by either 1,or 128 to get the corresponding bit planes
        }
    }

    imshow("out1",out1);
    waitKey(0);
    destroyWindow("out1");

    return 0;
}
原文链接:https://www.f2er.com/c/110704.html

猜你在找的C&C++相关文章