c – OpenCV中1平面图像的位平面仅适用于图像的1/3
发布时间:2020-12-16 03:40:33 所属栏目:百科 来源:网络整理
导读:我正在尝试通过自己做一些事来学习OpenCV.在这种特殊情况下,我想拍摄灰度图像的位平面.代码似乎有效,但它只适用于第7位和第6位,而不是其余6位,因为它只显示约1/3图像的良好结果.我还没有发现它有什么问题.我非常感谢有关此问题的一些帮助,因为我只是在编写我
我正在尝试通过自己做一些事来学习OpenCV.在这种特殊情况下,我想拍摄灰度图像的位平面.代码似乎有效,但它只适用于第7位和第6位,而不是其余6位,因为它只显示约1/3图像的良好结果.我还没有发现它有什么问题.我非常感谢有关此问题的一些帮助,因为我只是在编写我的第一个代码库.
这是我得到的第一位: 这是第7位: 这是我的代码: #include <opencv2opencv.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) 码: #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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |