Opencv 實現讀取 BMP 圖片

Opencv 是一個基於 C/C++ 語言的開源計算機視覺庫,可以用於圖像處理、特徵識別、目標跟蹤、機器學習等領域。在圖像處理中,讀取 BMP 圖片是常見操作之一。

一、打開 BMP 文件

BMP(Bitmap)是一種圖像文件格式,它的文件頭包含了點陣圖文件的一些參數,我們需要先讀取文件頭信息。

Mat bmp = imread("test.bmp", IMREAD_COLOR);
if (bmp.empty()) {
    cout << "Could not open or find the image" << endl;
    return -1;
}

我們首先使用 imread 函數讀取 BMP 文件,該函數返回的 Mat 對象包含了圖像的像素矩陣信息。如果文件不存在或者讀取失敗,imread 函數將返回一個空的 Mat 對象。

二、處理圖像數據

讀取 BMP 文件之後,我們需要將圖像數據轉換為可操作的像素矩陣。

Mat bmp = imread("test.bmp", IMREAD_COLOR);
if (bmp.empty()) {
    cout << "Could not open or find the image" << endl;
    return -1;
}
cvtColor(bmp, bmp, COLOR_BGR2RGB);
int width = bmp.cols;
int height = bmp.rows;
vector<uint8_t> data(bmp.data, bmp.data + bmp.total() * bmp.elemSize());

我們可以通過使用 cvtColor 函數將 BGR 通道轉換為 RGB 通道,這對後續的處理非常有幫助。然後我們可以分別獲取 BMP 圖片的寬度和高度,以及像素數據。在這裡,我們可以利用 Mat 對象的 data 屬性獲取像素矩陣的首地址,並轉換為 uint8_t 類型的 vector 容器。

三、解析 BMP 文件頭

BMP 文件頭包含了點陣圖文件的一些參數,包括文件類型、圖像寬度和高度、顏色位數等,我們需要解析文件頭並根據文件頭信息進行進一步處理。

// 解析 BMP 文件頭
uint32_t fileSize = *(uint32_t*)&data[2];
uint32_t pixelOffset = *(uint32_t*)&data[10];
uint32_t width = *(uint32_t*)&data[18];
uint32_t height = *(uint32_t*)&data[22];
uint16_t bitCount = *(uint16_t*)&data[28];
// 計算 BMP 圖片行位元組數
uint32_t rowSize = (width * bitCount + 31) / 32 * 4;
// 提取像素數據
vector<uint8_t> pixels(pixelOffset);
memcpy(&pixels[0], &data[pixelOffset], fileSize - pixelOffset);

我們可以定義一些變數來解析 BMP 文件頭,包括文件大小、像素偏移量、寬度、高度和顏色位數等信息。BMP 圖片的行位元組數可以通過公式 rowSize = (width * bitCount + 31) / 32 * 4 計算得出,從而確定每個像素所佔的位元組數。最後,我們可以提取像素數據並轉換為 vector 容器。

四、操作像素矩陣

像素矩陣是圖像處理的核心部分,我們可以使用它來實現許多基本操作,如圖像縮放、旋轉、裁剪等。

// 創建空白圖像
Mat newimg(height, width, CV_8UC3);
// 遍歷像素矩陣
for (int i = 0; i < height; i++) {
    for (int j = 0; j < width; j++) {
        int index = (i * rowSize) + (j * 3);
        newimg.at<Vec3b>(i, j) = Vec3b(pixels[index + 2], pixels[index + 1], pixels[index + 0]);
    }
}

我們可以通過像素行位元組數和像素位數來確定像素矩陣中每個像素所佔的位元組數,並使用 Vec3b 類型的 at 函數將像素數據放入 Mat 對象中。

五、小結

在使用 Opencv 實現讀取 BMP 圖片時,我們需要依次讀取 BMP 文件、處理圖像數據、解析 BMP 文件頭,並操作像素矩陣。這些步驟完成後,我們就可以對圖像進行各種操作了。

原創文章,作者:ALCQD,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/374116.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ALCQD的頭像ALCQD
上一篇 2025-04-27 15:26
下一篇 2025-04-27 15:27

相關推薦

  • 如何在PyCharm中安裝OpenCV?

    本文將從以下幾個方面詳細介紹如何在PyCharm中安裝OpenCV。 一、安裝Python 在安裝OpenCV之前,請確保已經安裝了Python。 如果您還沒有安裝Python,可…

    編程 2025-04-29
  • 用Python繪製酷炫圖片

    在本篇文章中,我們將展示如何使用Python繪製酷炫的圖片。 一、安裝Python繪圖庫 在使用Python繪製圖片之前,我們需要先安裝Python繪圖庫。Python有很多繪圖庫…

    編程 2025-04-29
  • Python OpenCV 直線檢測

    本文將介紹在Python OpenCV中進行直線檢測的方法,主要涉及到圖像的邊緣檢測、霍夫變換和繪製直線等操作。 一、邊緣檢測 由於直線檢測是從圖像的邊緣開始的,因此必須先找到圖像…

    編程 2025-04-29
  • 使用axios獲取返回圖片

    使用axios獲取返回圖片是Web開發中很常見的需求。本文將介紹如何使用axios獲取返回圖片,並從多個方面進行詳細闡述。 一、安裝axios 使用axios獲取返回圖片前,首先需…

    編程 2025-04-29
  • Python 圖片轉表格

    本文將詳細介紹如何使用Python將圖片轉為表格。大家平時在處理一些資料的時候難免會遇到圖片轉表格的需求。比如從PDF文檔中提取表格等場景。當然,這個功能也可以通過手動複製、粘貼,…

    編程 2025-04-29
  • Python緩存圖片的處理方式

    本文將從多個方面詳細闡述Python緩存圖片的處理方式,包括緩存原理、緩存框架、緩存策略、緩存更新和緩存清除等方面。 一、緩存原理 緩存是一種提高應用程序性能的技術,在網路應用中流…

    編程 2025-04-29
  • Python如何抓取圖片數據

    Python是一門強大的編程語言,能夠輕鬆地進行各種數據抓取與處理。抓取圖片數據是一個非常常見的需求。在這篇文章中,我們將從多個方面介紹Python如何抓取圖片數據。 一、使用ur…

    編程 2025-04-29
  • Avue中如何按照後端返回的鏈接顯示圖片

    Avue是一款基於Vue.js、Element-ui等技術棧的可視化開發框架,能夠輕鬆搭建前端頁面。在開發中,我們使用到的圖片通常都是存儲在後端伺服器上的,那麼如何使用Avue來展…

    編程 2025-04-28
  • Python利用Image加圖片的方法

    在Python中,利用Image庫可以快速處理圖片,並加入需要的圖片,本文將從多個方面詳細闡述這個操作。 一、Image庫的安裝和基礎操作 首先,我們需要在Python中安裝Ima…

    編程 2025-04-28
  • 使用CKSlide實現圖片輪播

    CKSlide是一個基於jQuery的插件,可以方便地為網頁添加幻燈片和圖片輪播效果。使用CKSlide可以讓網站更加生動、活潑,給用戶帶來更好的體驗。 一、CKSlide基本用法…

    編程 2025-04-28

發表回復

登錄後才能評論