使用OpenCV如何获取图像每个像素的灰度值??
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用OpenCV如何获取图像每个像素的灰度值??相关的知识,希望对你有一定的参考价值。
我做的图像处理软件,
现在碰到一个问题,不知道怎么获取图像的灰度值..
现在只会打开图像,能显示出来而已
求前辈们指教!!
#include"highgui.h"
#include
<iostream>
using
namespace
std;
int
main(int
argc,
char**
argv)
IplImage*
src
=
cvLoadImage(
"0.bmp",
0
); //导入图片
int
width=src->width;//图片宽度
int
height
=
src->height;//图片高度
for
(size_t
row=0;row<height;row++)
uchar*
ptr
=
(uchar*)src->imageData+row*src->width;//获得灰度值数据指针
for
(size_t
cols=0;cols<width;cols++)
int
intensity=ptr[cols];
cout<<intensity<<"
";
return
0;
参考技术A #include"cv.h"
#include"highgui.h"
#include
<iostream>
using
namespace
std;
int
main(int
argc,
char**
argv)
IplImage*
src
=
cvLoadImage(
"0.bmp",
0
);
//导入图片
int
width=src->width;//图片
宽度
int
height
=
src->height;//图片
高度
for
(size_t
row=0;row<height;row++)
uchar*
ptr
=
(uchar*)src->imageData+row*src->width;//获得
灰度
值数据
指针
for
(size_t
cols=0;cols<width;
col
s++)
int
intensity=ptr[cols];
cout<<intensity<<"
";
return
0;
参考技术B #include"cv.h"
#include"highgui.h"
#include <iostream>
using namespace std;
int main(int argc, char** argv)
IplImage* src = cvLoadImage( "0.bmp", 0 ); //导入图片
int width=src->width;//图片宽度
int height = src->height;//图片高度
for (size_t row=0;row<height;row++)
uchar* ptr = (uchar*)src->imageData+row*src->width;//获得灰度值数据指针
for (size_t cols=0;cols<width;cols++)
int intensity=ptr[cols];
cout<<intensity<<" ";
return 0;
本回答被提问者采纳
如何使用opencv在彩色图像和灰度图像之间进行分类?
【中文标题】如何使用opencv在彩色图像和灰度图像之间进行分类?【英文标题】:How to classify between a color image and grey scale image using opencv? 【发布时间】:2019-01-17 23:07:55 【问题描述】:我有一个用例,我需要将一些图像分类为灰度或彩色。我的第一步是基于灰度图像应该在一个像素处具有 r、g、b 值的特征,与单通道相同的值。至于彩色图像,同一像素的 r,g,b 值可能不一样。
所以我通过获取 (r,g)、(b,g) 和 (r,b) 之间的差异来进行检查,如果这三个都只有零,那么它的灰度,它的颜色。
这种方法帮助我识别了许多灰度图像,但仍有一些图像不遵循此逻辑。谁能指定一些好的特征,我们可以在这些特征上使用 opencv 将图像分类为彩色或灰度?
不要让我检查通道数和分类,因为我们以 .jpg 格式加载它,所以这两个类都为 3。
提前致谢
【问题讨论】:
查看***.com/questions/23660929/… @SuryaTej 我只从这个逻辑开始。我应用了它并按照问题中的说明进行了尝试。它不适用于所有情况 @Sreekiran 你能发布一个不符合这个逻辑的例子吗? 我不认为我被允许这样做。我会试试的。 您可以稍微放宽标准并保留像素计数器。例如,如果计数器计数通道之间差异小于(小)阈值的像素,则在计数器上设置相对于图像分辨率的另一个阈值。 【参考方案1】:我怀疑,有些在数字化后从未成为灰度图像(例如灰度图片的彩色扫描)。由于噪声,RGB 值的差异很小。大于完美零的低阈值应该可以解决问题。
请注意,JPEG 完全有一个灰度选项。但是,在存储图片时,您需要该模式。压缩机通常不会自动拾取它。此外,您在使用 OpenCV 的 imread
阅读时明确需要设置标志 IMREAD_UNCHANGED
。
【讨论】:
IMREAD_UNCHANGED 适用于我转换为灰度并存储的普通图像。但是,不适用于我的用例。它仅作为 3 通道读取。 你能检查每对通道的元素之间的最大差异吗?【参考方案2】:使用@QuangHoang 建议的方法,我得到了85+% 准确率的结果。 这是解释的方法。
#test image
img=cv2.imread('test.jpg')
r,g,b=cv2.split(img)
#spliting b,g,r and getting differences between them
r_g=np.count_nonzero(abs(r-g))
r_b=np.count_nonzero(abs(r-b))
g_b=np.count_nonzero(abs(g-b))
diff_sum=float(r_g+r_b+g_b)
#finding ratio of diff_sum with respect to size of image
ratio=diff_sum/img.size
if ratio>0.005:
label='color'
else:
label='grey'
感谢所有建议。
【讨论】:
以上是关于使用OpenCV如何获取图像每个像素的灰度值??的主要内容,如果未能解决你的问题,请参考以下文章
python使用openCV图像加载(转化为灰度图像)平滑图像处理就是将每个像素的值变换为其相邻元素的平均值可视化平滑处理之后的图像(Blurring Images)