我正在尝试通过自己做一些事来学习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; }