1. 程式人生 > >【OpenCV】之LUT函式

【OpenCV】之LUT函式

何為LUT,LUT(Look-Up Table)實際上就是一張畫素灰度值的對映表,它將實際取樣到的畫素灰度值經過一定的變換如閾值、反轉、二值化、對比度調整、線性變換等,變成了另外一個與之對應的灰度值,這樣可以起到突出影象的有用資訊,增強影象的光對比度的作用。
其實查詢表的實質就是:把影象中的資料從之前的比較高的灰度級降下來,例如灰度級是256的char型別的灰度級,我們通過一個引數,將原來的256個灰度級降到了3個灰度級,原來影象中灰度值在0-100的資料現在灰度值變成了0,原來灰度值為101-200的影象資料現在灰度值變為了1,而201-256的灰度值就變為了2。所以通過引數100,影象的灰度級就到了2,只有0,1,2三個灰度值,那麼原來的影象矩陣中的每一位資料我們是char型的,需要8位來表示一個數據,而灰度級降下來之後,我們只需要2位就足以表示所有灰度值。

OpenCV中LUT函式

void LUT(InputArray src, InputArray lut, OutputArray dst);
//src表示的是輸入影象(可以是單通道也可是3通道)
//lut表示查詢表(查詢表也可以是單通道,也可以是3通道,如果輸入影象為單通道,那查詢表必須為單通道,若輸入影象為3通道,查詢表可以為單通道,也可以為3通道,若為單通道則表示對影象3個通道都應用這個表,若為3通道則分別應用 )
//dst表示輸出影象

單通道影象
對於8位單通道圖片,其畫素灰度為0~255,若我們想對影象灰度進行降級,就可以使用LUT。
例如:
我們將一張圖片灰度為0~100的畫素灰度變成為0,101~200的變成為100,201~255的變成為255。建立如下表格:
這裡寫圖片描述


當把此表格應用到圖片時,影象0-100灰度的畫素,灰度就變為0,101-200的變成100,201-255的變成255.

相關程式碼:

#include<highgui\highgui.hpp>  
using namespace cv;  
int main()  
{  
    //查詢表,陣列的下標對應圖片裡面的灰度值  
    //例如lutData[20]=0;表示灰度為20的畫素其對應的值0.  
    //可能這樣說的不清楚仔細看下程式碼就清楚了。  
    uchar lutData[256];  
    for (int i = 0; i<256; i++)  
    {  
        if
(i<=100) lutData[i] =0; if (i > 100 && i <= 200) lutData[i] = 100; if (i > 200) lutData[i] = 255; } Mat lut(1, 256, CV_8UC1, lutData); Mat a = imread("C:\\Users\\11206\\Desktop\\OpencvTestImage\\2.jpg", CV_LOAD_IMAGE_GRAYSCALE); Mat b; namedWindow("anjis", CV_WINDOW_AUTOSIZE); namedWindow("anjis1", CV_WINDOW_AUTOSIZE); imshow("anjis", a); LUT(a, lut, b); imshow("anjis1", b); waitKey(); }

結果顯示:
這裡寫圖片描述

8位3通道影象
對於8位3通道的查詢表和單通道的原理一樣。OpenCV中內部實現每個通道都分別建立一張表,表格的建立和單通道一樣。
處理影象時,分別對每一個通道應用各自的表。
這裡寫圖片描述 這裡寫圖片描述 這裡寫圖片描述
當把上述表格應用到影象時,R通道的0-100灰度的畫素灰度值就變為0,101-200的變成100,201-255的變成255.G通道的0-100灰度的畫素灰度值變為50,101-200的變成100,201-255的變成200.B通道的0-100灰度的畫素灰度值變成50,101-200的變成200,201-255的變成100。和單通道一樣。
相關示例程式碼:

#include<highgui\highgui.hpp>  
using namespace cv;  
int main()  
{  
    uchar lutData[256 * 3];  
    int j = 0;  
    for (int i = 0; i<256; i++)  
   {  
       if (i <= 100)  
        {  
            lutData[i * 3] = 0;  
            lutData[i * 3 + 1] = 50;  
            lutData[i * 3 + 2] = 50;  
        }  
        if (i > 100 && i <= 200)  
        {  
            lutData[i * 3] = 100;  
            lutData[i * 3 + 1] = 10;  
            lutData[i * 3 + 2] = 200;  
        }  
        if (i > 200)  
        {  
            lutData[i * 3] = 255;  
            lutData[i * 3 + 1] = 200;  
            lutData[i * 3 + 2] = 100;  
        }    
    }  
    Mat lut(1, 256, CV_8UC3, lutData);  
    Mat a = imread("C:\\Users\\11206\\Desktop\\OpencvTestImage\\2.jpg", CV_LOAD_IMAGE_ANYCOLOR);  
    Mat b;  
    namedWindow("anjis", CV_WINDOW_AUTOSIZE);  
    namedWindow("anjis1", CV_WINDOW_AUTOSIZE);  
    imshow("anjis", a);  
    LUT(a, lut, b);  
    imshow("anjis1", b);  
    waitKey();  
}  

輸出結果:
這裡寫圖片描述
【參考:】

相關推薦

OpenCVLUT函式

何為LUT,LUT(Look-Up Table)實際上就是一張畫素灰度值的對映表,它將實際取樣到的畫素灰度值經過一定的變換如閾值、反轉、二值化、對比度調整、線性變換等,變成了另外一個與之對應的灰度值,這樣可以起到突出影象的有用資訊,增強影象的光對比度的作用。

OpenCV查詢表用法以及LUT函式的使用

參考的三篇部落格的地址 簡單地說,查詢表就是通過建立一個table與源影象之間建立一個對映,可以使單通道,也可以是多通道,在定義將0~255的畫素對映成為不同的值後,通過查詢表的下標進行相應的賦值操作,例如table[127]=0 表示的就是將源影象中灰度值為1

opencv入門感興趣區域ROI,線性混合addWeighted

bsp enc 擁有 ted 興趣 通道數 amp log 兩個 參考網站: http://blog.csdn.net/poem_qianmo/article/details/20911629 1、感興趣區域ROI   //【2】定義一個Mat類型並給其設定ROI區

opencv入門形態學圖像處理(一):膨脹、腐蝕

tar struct show 函數 使用 運算 腐蝕和膨脹 依賴 版本 參考網站: http://blog.csdn.net/poem_qianmo/article/details/23710721 1、形態學(morphology)概述   數學形態學(Mathem

調參損失函式train loss 和 test loss 一直不下降

正常情況: train loss 不斷下降,test loss不斷下降,說明網路仍在學習; 異常情況: train loss 不斷下降,test loss趨於不變,說明網路過擬合; train loss 趨於不變,test loss不斷下降,說明資料集100%有問題; train los

轉載ReLU啟用函式:簡單

導語 在深度神經網路中,通常使用一種叫修正線性單元(Rectified linear unit,ReLU)作為神經元的啟用函式。ReLU起源於神經科學的研究:2001年,Dayan、Abott從生物學角度模擬出了腦神經元接受訊號更精確的啟用模型,如下圖: 其中橫軸是時間(m

OpencvOpencvMat

Mat Mat的簡單使用 從實際出發,先看看他幹啥的,怎麼用。 一般我們用到Mat有兩個重要的用途: 1.儲存影象(其實影象可以看成一個高行寬列的一個矩陣) 2.儲存矩陣 先來看看Mat用於影象和矩陣的最基本操作,讀取一副影象,修改影象中某些畫素的值,最後顯示並儲存,建立矩陣

OpenCVOpenCVcalcHist() 計算直方圖

OpenCV 2.4.13 calcHist 通過影象計算直方圖 函式宣告如下:   void calcHist( const Mat* images, int nimages, const int* channels, Inpu

wav音訊解析wavread函式的C++實現

      本文由三部分組成,第一部分背景介紹 —— 音訊型別及本文動機,第二部分類比matlab下wavread()函式的作用,第三部分則給出該函式的C++實現。 一 背景介紹 1.1 本文動機 1)所有wav音訊處理的基礎就是將wav格式的檔案解析出來,解析成陣列才

opencv學習十四Opencv灰度直方圖和均值化直方圖

什麼是直方圖,以下摘自opencv國內論壇: 什麼是直方圖? 直方圖是對資料的集合 統計 ,並將統計結果分佈於一系列預定義的 bins 中。 這裡的 資料 不僅僅指的是灰度值 (如上一篇您所看到的), 統計資料可能是任何能有效描述影象的特徵。 先看一個例子吧。 假設有一個矩

opencv學習三十八影象的分水嶺演算法

分水嶺演算法主要根據影象梯度將影象分割成“山”和“谷”;一般影象噪聲經常干擾分水嶺演算法的分割,所以一般採用標記的方法來給分水嶺演算法提供灰度級參考,來更換的分割影象;從效果來說比普通的灰度閾值分割效果要好;演算法的具體原理和實現可參考網上的詳解;原函式及解釋:CV_EXPO

opencv學習四十三K均值聚類演算法

K均值聚類演算法,在opencv中通過kmeans()函式實現;k均值通俗講:就是從一堆樣本中,隨便挑出幾個,比如3個吧,然後用樣本中的和這挑出來的比較,比較後排序,誰和挑出的那個接近就把他劃到那個類裡,比如樣A和挑1、挑2、挑3中,挑2最接近,則把樣A劃到挑2裡,當然還沒完

opencv學習四十二簡單運動檢測

視訊運動檢測基本思想是進行每一幀對比,檢測不同然後得出是否運動,一般分為兩種,背景法和差幀法;背景法是:將一幅圖作為背景,讓後和每一幀對比;缺點是一開始存入的背景可能隨光照變法而造成錯誤,但是可以用在光照環境穩定的地方,優點是可以檢測之前背景沒有的景象;差幀法是:將前一幀和後

OpenCVSURF演算法視訊影象實時特徵點匹配

OpenCV原始碼中有關於SURF演算法的靜態影象特徵點匹配,就將其改進為動態視訊影象實時獲取特徵點並將其與目標影象進行特徵點匹配。 考慮到如果沒有獲取到連續幀影象,即有黑色影象被攝像頭捕捉到,此時FLANN演算法則失效,因為FLANN演算法是無法處理黑色影象的,它必須能採

opencv學習三十簡單模板匹配matchTemplate

opencv實現了一部分通過模板與目標影象進行尋找最佳匹配的方面matchTemplat();這個方法網上有很多講解,基本思想是將模板影象在目標影象上滑動逐一對比,通過統計的基本方法進行匹配,比如方差檢驗,相關性檢驗等方法來尋找最佳匹配;話不多多說吧,從網上找到的一些實驗程式

opencv學習配置Opencv3.2.0+Qt5.8.0開發環境

配置時候折騰了一陣,後來配置成功,而且非常簡單,下面具體: 前期準備: 1.確定自己電腦系統是win7及以上的(64位,因為Opencv3.2.0只支援64位且vc14以上編譯dll); 2.下載Qt5.8.0,地址:https://www.qt.io/download-o

opencv學習四十四影象放縮與金字塔

在opencv中影象有時候過大導致進行操作時候資訊量過大,耗時較長,一般可以將影象壓縮,然後根據進行初步資訊搜尋,減少搜尋範圍,然後定位可能搜尋區域進行再次分析。opencv有對影象進行放大(向上取樣)和縮小(向下取樣)兩個函式PyrUp()和PyrDown(),可以直接操作

opencv學習二十四OpenCV濾波處理對比

OpenCV的鄰域濾波處理函式主要都通影象的卷積操作,有 1方框濾波boxFilter(),屬於線性濾波,其原理是用一個矩陣和一個核矩陣卷積操作; 2均值濾波blur(),也屬於線性濾波,是方框濾波一種歸一化後的方框濾波; 3高斯濾波GaussianBlur(),屬於線性濾

opencv學習Qt+Opencv製作類似halcon圖片檢視功能

實現如下功能開啟圖片,並顯示opencv運算元功能: 圖元視窗檢視和程式流程視窗檢視,以及圖元檢視三個功能: 實現幾個運算元的對話方塊引數設定: 圖元檢視視窗放大縮小等操作: 文字儲存: 運算元流程儲存: 原始碼在:https://github.co

rediscentos6.x安裝redis3.0.x

local con releases 新建 zxvf 分享 執行 .tar.gz all centos6.9_x86_64 1、下載redis安裝包 http://download.redis.io/releases/redis-3.2.9.tar.gz 2、解壓 tar