当前位置: 首页 > 知识库问答 >
问题:

OpenCV像素操作有时不起作用

万俟嘉珍
2023-03-14

我尝试使用如下所示的指针修改BGRA mat:

//Bound the value between 0 to 255
uchar boundPixelValue(double c) {
    c = int(c);
    if (c > 255)
        c = 255;
    if (c < 0)
        c = 0;
    return (uchar) c;
}

for (int i = 0; i < rows; i++)
        for (int j = 0; j < cols; j++)
            for (int k = 0; k < 3; k++){
                //This loop is accessing the first three channels
                mat.ptr<Vec4b>(i)[j][k] = boundPixelValue(
                        1.0 * mat.ptr<Vec4b>(i)[j][k] * max / avg[k]);
            }

但这给出不同的输出每一次,有时工作,有时给一个白色空白的图像。我怀疑如果这是由于不连续的数据,谁能帮助?

一个额外的问题,通常我们在访问行之前首先访问二维数组的列,因为它通常更快。但是,我必须使用mat.ptr (row)[col] 访问像素。那么,我应该先循环遍历行然后遍历列吗?

共有1个答案

卫诚
2023-03-14

更简单、强度更小的方法是:

std::vector<cv::Mat> matArray;
cv::split(toBoundMat, matArray);

matArray[0].setTo(0, matArray[0] < 0);
matArray[0].setTo(255, matArray[0] > 255);

matArray[1].setTo(0, matArray[1] < 0);
matArray[1].setTo(255, matArray[1] > 255);

matArray[2].setTo(0, matArray[2] < 0);
matArray[2].setTo(255, matArray[2] > 255);

cv::Mat boundedMat;

cv::merge(matArray, boundedMat);

但我真的不明白你想做什么。您的double数据的值可能介于1.7e+/-308之间。你要么期待一个非常具体的数据类型,要么你会把它搞砸。如果你想让一个垫子变得可视化,只需像这样标准化它:

cv::normalize(inMat, destMat, 0, 255, CV_MINMAX);

cv::cvtColor(destMat, destMat, CV_8UC1) //--(8 bit visualizable mat)

这将检查当前Mat的最小值和最大值,并将最小值设置为0,最大值设置为255,并按比例设置所有的in between值:)

 类似资料:
  • 在前面我们已经了解到图像的数据结构、栅格、坐标系和坐标转下标的方法,仅凭 LCUI 提供的这点图形 API 无法让我们轻松绘制复杂的图形,所以我们有必要学会如何操作像素数据,以便自己手动编码或借助其它图形库的能力来绘制图形。 注意,虽然像素数据的类型名是 LCUI_ARGB,但这些颜色通道的值在内存中存储的顺序是 BGRA。之所以采用这种顺序,是因为 Linux 中的帧缓存(FrameBuffer

  • 本文向大家介绍Python OpenCV处理图像之图像像素点操作,包括了Python OpenCV处理图像之图像像素点操作的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Python OpenCV图像像素点操作的具体代码,供大家参考,具体内容如下 0x01. 像素 有两种直接操作图片像素点的方法: 第一种办法就是将一张图片看成一个多维的list,例如对于一张图片im,想要操作第四行第

  • 如果要对图像进行进一步的处理,就可以先通过getImageData()方法获取图像像素,进行处理后再通过putImageData()方法,把处理后的像素重新绘制到画布中。 1)getImageData()方法 该方法用于获取画布上指定区域的图像像素数据。调用格式如下: var data = context.getImageData(sx, sy, sWidth, sHeight) 其中,sx、s

  • 我正在我的应用程序中使用ActionSheet。在我的iPhone上它可以工作,但在iPad模拟器上却不行。 这是我的代码: 我的错误是: 由于未捕获的异常“NSGenericeException”而终止应用程序,原因:“您的应用程序已呈现UIAlertControllerStyleActionSheet样式的UIAlertController()。具有此样式的UIAlertController的

  • 主要内容:更多scharr变体Scharr也用于检测水平和垂直方向的图像的二阶导数。可以使用方法对图像执行操作。以下是这种方法的语法 - 该方法接受以下参数 - src - 表示源(输入)图像的类的对象。 dst - 表示目标(输出)图像的类的对象。 ddepth - 表示图像深度的整数变量()。 dx - 表示导数的整数变量(或)。 dy - 表示导数的整数变量(或)。 示例 以下程序演示了如何将应用于给定的图像。 假定以下

  • 目标 访问像素值并修改它们 访问图像属性 设置图像区域(ROI) 分割和合并图像 本节中几乎所有的操作主要涉及到Numpy而不是OpenCV。需要熟悉Numpy才能用OpenCV编写更好的代码。 1、获取并修改像素值 读取一副图像,根据像素的行和列的坐标获取它的像素值,对于RGB图像而言,返回RGB的值,对于灰度图则返回灰度值 import cv2 import numpy img = cv2.i