首頁  >  文章  >  後端開發  >  如何在 OpenCV 中從 Mat 影像中提取像素通道值?

如何在 OpenCV 中從 Mat 影像中提取像素通道值?

DDD
DDD原創
2024-11-15 22:47:02672瀏覽

How to Extract Pixel Channel Values from a Mat Image in OpenCV?

OpenCV:從Mat 影像擷取像素通道值

問題:如何擷取Mat 影像中特定像素的通道值?

答案:

對於像素類型為CV_8UC3(8 位元無符號3 通道影像)的Mat 對象,可以使用以下方法:

for(int i = 0; i < foo.rows; i++)
{
    for(int j = 0; j < foo.cols; j++)
    {
        Vec3b bgrPixel = foo.at<Vec3b>(i, j);

        // Process the BGR values...
    }
}

在此程式碼中,Vec3b 表示一個3 通道像素,每個通道有8 位元無符號整數。 at 是一個成員函數,可讓您存取指定行和列處的像素值。

效能最佳化:

為了提高效能,請考慮存取資料緩衝區直接:

uint8_t* pixelPtr = (uint8_t*)foo.data;
int cn = foo.channels();
Scalar_<uint8_t> bgrPixel;

for(int i = 0; i < foo.rows; i++)
{
    for(int j = 0; j < foo.cols; j++)
    {
        bgrPixel.val[0] = pixelPtr[i*foo.cols*cn + j*cn + 0]; // B
        bgrPixel.val[1] = pixelPtr[i*foo.cols*cn + j*cn + 1]; // G
        bgrPixel.val[2] = pixelPtr[i*foo.cols*cn + j*cn + 2]; // R

        // Process the BGR values...
    }
}

或者,也可以使用row 方法:

int cn = foo.channels();
Scalar_<uint8_t> bgrPixel;

for(int i = 0; i < foo.rows; i++)
{
    uint8_t* rowPtr = foo.row(i);
    for(int j = 0; j < foo.cols; j++)
    {
        bgrPixel.val[0] = rowPtr[j*cn + 0]; // B
        bgrPixel.val[1] = rowPtr[j*cn + 1]; // G
        bgrPixel.val[2] = rowPtr[j*cn + 2]; // R

        // Process the BGR values...
    }
}

注意:OpenCV 內部以BGR 格式儲存影像,而非RGB。

以上是如何在 OpenCV 中從 Mat 影像中提取像素通道值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn