我只想弄清楚我的概念-访问CV::MAT的所有矩阵元素是否意味着我实际上访问了图像的所有像素值(灰度-1通道,颜色-3通道)?假设我的代码打印灰度矩阵的值(加载1通道图像,类型为CV_32FC1),如下所示,那么这意味着我只访问cv::mat的成员,还是我也访问图像的像素值(具有1通道灰度,类型为CV_32FC1)?
cv::Mat img = cv::imread("lenna.png");
for(int j=0;j<img.rows;j++)
{
for (int i=0;i<img.cols;i++)
{
std::cout << "Matrix of image loaded is: " << img.at<uchar>(i,j);
}
}
我对使用OpenCV进行图像处理还是一个新手,我想澄清一下我的想法。如果我错了,那么我如何访问图像的每个像素值呢?
您正在访问矩阵的元素,同时也正在访问图像本身。在代码中,执行以下操作后:
cv::Mat img = cv::imread("lenna.png");
矩阵img表示图像lenna.png。(如果成功打开)
你为什么不改变一些像素值来试验一下呢:
cv::Mat img = cv::imread("lenna.png");
//Before changing
cv::imshow("Before",img);
//change some pixel value
for(int j=0;j<img.rows;j++)
{
for (int i=0;i<img.cols;i++)
{
if( i== j)
img.at<uchar>(j,i) = 255; //white
}
}
//After changing
cv::imshow("After",img);
注意:这只会改变易失性存储器中的图像值,也就是当前加载mat img的地方。修改mat img的值,不会改变存储在磁盘中的实际映像“lenna.png”中的值(除非您写了imwrite)
但在单通道灰度图像的情况下,它是CV_8UC1而不是CV_32FC1
实际上我想对每个像素做一些计算,为此我需要显式地访问每个像素。 如有任何帮助或建议,我们将不胜感激。
问题内容: 我正在尝试导出单色“灰度”图像中特定像素的强度值。我有一些伪代码,但是到目前为止,我还无法实现真正有效的功能。 问题答案: 也许这会帮助您: http://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html http://docs.oracle.com/javase/7/docs/api/javax
以下程序演示如何将彩色图像读取为灰度并使用JavaFX窗口显示。 在这里通过将标志与带有彩色图像路径的字符串一起传递来读取图像。 假定以下是上述程序中指定的输入图像。那么输出结果应该为一个灰色的图片。
问题内容: 我正在尝试直接读取黑白图像。 我最近将OpenCv版本更新为3.0.0-dev,以前使用的代码不再起作用。 适用于2.4,但不能用于新版本,因为没有field 。 有什么建议? 注意:我知道可以使用,但是我不喜欢在代码中使用未命名的常量。谢谢! 问题答案: 该标志已重命名为。一般来说,标志现在以与它们所引用的功能有关的方式为名称加上前缀。(例如,标记以,标记以等等开头)
主要内容:将彩色图像转换为灰度在前面的章节中,我们讨论了如何读取不同类型的输入图像(二进制,灰度,BGR等)。 在本章中,我们将学习如何将一种图像转换为另一种图像。 包中名为的类提供了将图像从一种颜色转换为另一种颜色的方法。 将彩色图像转换为灰度 使用方法将彩色图像转换为灰度。 以下是此方法的语法。 该方法接受以下参数 - src - 表示来源的矩阵。 dst - 表示目的地的矩阵。 code - 表示转换类型的整数代码,例如
问题内容: 我正在开发一个有关图像处理的项目,在该项目中,我必须填充破裂绘画的数字化图像。我必须将彩色图像转换为灰度图像,对灰度图像的2D数组执行一些计算,然后将其写回灰度图像。此代码是: 但是输出的图像要暗得多,我没有找回原始图像(我还没有做任何更改)。 我认为setRGB()语句中应该有一些更改,但我不知道是什么。 为了写回图像,我也尝试过: ` ` 但这也不会给我原始图像。 谁能提供我这个问