OpenCV圖像處理專欄十五 |《一種基於亮度均衡的圖像閾值分割技術》

2021-02-21 GiantPandaCV
前言

對於光照不均勻的圖像,用通常的圖像分割方法不能取得滿意的效果。為了解決這個問題,論文《一種基於亮度均衡的圖像閾值分割技術》提出了一種實用而簡便的圖像分割方法。該方法針對圖像中不同亮度區域進行亮度補償,使得整個圖像亮度背景趨於一致後,再進行常規的閾值分割。實驗結果表明,用該方法能取得良好的分割效果。關於常規的閾值分割不是我這篇推文關注的,我這裡只實現前面光照補償的部分。算法的原理可以仔細看論文。論文原文見附錄。

算法步驟求取原始圖src的平均灰度,並記錄rows和cols。按照一定大小,分為個方塊,求出每塊的平均值,得到子塊的亮度矩陣。用矩陣的每個元素減去原圖的平均灰度,得到子塊的亮度差值矩陣。用雙立方插值法,將矩陣 resize成和原圖一樣大小的亮度分布矩陣。代碼實現
Mat speed_rgb2gray(Mat src) {
Mat dst(src.rows, src.cols, CV_8UC1);
#pragma omp parallel for num_threads(12)
for (int i = 0; i < src.rows; i++) {
for (int j = 0; j < src.cols; j++) {
dst.at<uchar>(i, j) = ((src.at<Vec3b>(i, j)[0] << 18) + (src.at<Vec3b>(i, j)[0] << 15) + (src.at<Vec3b>(i, j)[0] << 14) +
(src.at<Vec3b>(i, j)[0] << 11) + (src.at<Vec3b>(i, j)[0] << 7) + (src.at<Vec3b>(i, j)[0] << 7) + (src.at<Vec3b>(i, j)[0] << 5) +
(src.at<Vec3b>(i, j)[0] << 4) + (src.at<Vec3b>(i, j)[0] << 2) +
(src.at<Vec3b>(i, j)[1] << 19) + (src.at<Vec3b>(i, j)[1] << 16) + (src.at<Vec3b>(i, j)[1] << 14) + (src.at<Vec3b>(i, j)[1] << 13) +
(src.at<Vec3b>(i, j)[1] << 10) + (src.at<Vec3b>(i, j)[1] << 8) + (src.at<Vec3b>(i, j)[1] << 4) + (src.at<Vec3b>(i, j)[1] << 3) + (src.at<Vec3b>(i, j)[1] << 1) +
(src.at<Vec3b>(i, j)[2] << 16) + (src.at<Vec3b>(i, j)[2] << 15) + (src.at<Vec3b>(i, j)[2] << 14) + (src.at<Vec3b>(i, j)[2] << 12) +
(src.at<Vec3b>(i, j)[2] << 9) + (src.at<Vec3b>(i, j)[2] << 7) + (src.at<Vec3b>(i, j)[2] << 6) + (src.at<Vec3b>(i, j)[2] << 5) + (src.at<Vec3b>(i, j)[2] << 4) + (src.at<Vec3b>(i, j)[2] << 1) >> 20);
}
}
return dst;
}


Mat unevenLightCompensate(Mat src, int block_Size) {
int row = src.rows;
int col = src.cols;
Mat gray(row, col, CV_8UC1);
if (src.channels() == 3) {
gray = speed_rgb2gray(src);
}
else {
gray = src;
}
float average = mean(gray)[0];
int new_row = ceil(1.0 * row / block_Size);
int new_col = ceil(1.0 * col / block_Size);
Mat new_img(new_row, new_col, CV_32FC1);
for (int i = 0; i < new_row; i++) {
for (int j = 0; j < new_col; j++) {
int rowx = i * block_Size;
int rowy = (i + 1) * block_Size;
int colx = j * block_Size;
int coly = (j + 1) * block_Size;
if (rowy > row) rowy = row;
if (coly > col) coly = col;
Mat ROI = src(Range(rowx, rowy), Range(colx, coly));
float block_average = mean(ROI)[0];
new_img.at<float>(i, j) = block_average;
}
}
new_img = new_img - average;
Mat new_img2;
resize(new_img, new_img2, Size(row, col), (0, 0), (0, 0), INTER_CUBIC);
Mat new_src;
gray.convertTo(new_src, CV_32FC1);
Mat dst = new_src - new_img2;
dst.convertTo(dst, CV_8UC1);
return dst;
}

效果

可以看到經過這個算法處理之後,亮度確實被均衡了一些,從視覺效果上來看還是有作用的。

附錄論文原文:https://wenku.baidu.com/view/f74cc087e53a580216fcfe52.html?from=search同期文章

歡迎關注GiantPandaCV, 在這裡你將看到獨家的深度學習分享,堅持原創,每天分享我們學習到的新鮮知識。( • ̀ω•́ )✧

有對文章相關的問題,或者想要加入交流群,歡迎添加BBuf微信:

在這裡插入圖片描述

相關焦點

  • 基於OpenCV的區域分割、輪廓檢測和閾值處理
    因此,代替處理整個框架,如果可以在框架中定義一個子區域並將其視為要應用處理的新框架,該怎麼辦。我們要完成一下三個步驟: 定義興趣區 在ROI中檢測輪廓 閾值檢測輪廓輪廓線 什麼是ROI?
  • 基於opencv 的圖像處理入門教程
    前言雖然計算機視覺領域目前基本是以深度學習算法為主,但實際上很多時候對圖片的很多處理方法,並不需要採用深度學習的網絡模型,採用目前成熟的圖像處理庫即可實現,比如 OpenCV 和 PIL ,對圖片進行簡單的調整大小、裁剪、旋轉,或者是對圖片的模糊操作。
  • 使用Python+OpenCV進行圖像處理(二)
    整個視覺入門系列內容如下:理解顏色模型與在圖像上繪製圖形(圖像處理基本操作)。基本的圖像處理與濾波技術。從特徵檢測到人臉檢測。圖像分割與分水嶺(Watershed)算法(TBU)在邊緣和輪廓檢測中,噪聲對檢測的精度有很大的影響。
  • OpenCV圖像處理--邊緣檢測
    邊緣檢測的關鍵思想是像素亮度差異極大的區域表示邊緣。因此,邊緣檢測是對圖像亮度不連續性的一種度量。Sobel邊緣檢測Sobel邊緣檢測器也稱為Sobel–Feldman運算符或Sobel過濾器,它的工作原理是通過計算圖像中每個像素的圖像強度梯度。它找到了從亮到暗的最大亮度增加方向以及該方向的變化率。
  • 【數字圖像處理系列五】圖像濾波之空間濾波:圖像平滑降噪和圖像銳化
    快速入門篇【數字圖像處理系列一】基本概念:亮度、對比度、飽和度、銳化、解析度【數字圖像處理系列二】圖像增強:線性、 分段線性、 對數、 反對數、 冪律(伽馬)變換、直方圖均衡【數字圖像處理系列三】圖像數據集增強方式總結和實現【數字圖像處理系列四】在圖像增強:線性、 分段線性、 對數、 反對數、 冪律(伽馬)變換、直方圖均衡【數字圖像處理系列三】一文中我們從圖像灰度變換的角度闡述了圖像增強的各種方式,本文我們將一起學習圖像處理中重點的方式:圖像濾波,圖像濾波分為空間域濾波和頻率域濾波,頻率域濾波我們將在下一節重點說明
  • 一種自適應紅外圖像增強處理的FPGA實現
    但是由於受紅外探測器件的影響,紅外成像儀的成像效果還不夠理想,主要表現為圖像中的目標與背景區分不明顯、對比度低、噪聲大、信噪比低等缺點,因而紅外圖像處理首要解決的問題是圖像增強。要實現圖像的增強處理,主要有兩個途徑:一是改善探測器性能,一是在紅外圖像系統電子部分加入實時圖像處理功能。在目前條件下,加入實時圖像處理功能是快速而經濟的做法。
  • 高清成像技術讓條碼圖像更清晰
    隨著數字圖像技術的不斷成熟,高清成像處理技術在各領域也逐步發展起來,它具有分析精度高、處理內容豐富、可以進行複雜的非線性分析等特點。高清成像處理過程是將條碼的圖像信號轉換成數位訊號並利用軟體進行分析,與傳統方法相比具有更大的靈活性和較低的成本,因此,在條碼識讀及檢測領域具有很大的發展潛力。
  • 基於顏色特徵與直方圖閾值相結合的田間青椒圖像分割算法
    由於機器人採集的圖像受到自然光的影響,青椒果實表面與其周圍葉片等環境存在一定的差別, 目前常用的圖像分割方法有兩種:利用圖像的顏色特徵進行分割以及利用BP神經網絡對圖像進行分割。2 田間青椒圖像顏色特徵的分析算法 顏色是自然界中一種常見的物理現象,是外界的光刺激引起人的顏色視覺細胞的感應。目前,用於定量地描述顏色的模型有許多種,在與數字圖像處理有關的研究中使用得最多的顏色模型是RGB模型和HIZ模型。
  • ImagePy——UI界面支持開放插件的Python開源圖像處理框架
    ImagePy 是一款基於 imagej 等插件的圖像處理框架,它可以與 scipy.ndimage、scikit-image、opencv、simpleitk、mayavi 以及任何基於 numpy 的庫進行組合使用,其地址為 http://imagepy.org。
  • 一種基於人工智慧的腦圖像處理方法
    打開APP 一種基於人工智慧的腦圖像處理方法 MedPeer 發表於 2019-10-22 16:41:57 (文章來源:MedPeer
  • Double DIP——一種無監督層圖像分割 AI 技術
    今年三月份,他們選擇了由 Yossi Gandelsman,Assaf Shocher 和 Michal Irani 三位學者(下文中所提到的作者,均指以上三位學者)共同完成的關於 Double-DIP 模型的論文,其中詳細介紹了基於耦合的深度圖像先驗網絡對單個圖像進行無監督層分割這一技術。概況許多看似無關的計算機視覺任務可以被視為圖像分割為不同的層的特殊情況。
  • Double DIP ——一種無監督層圖像分割 AI 技術
    今年三月份,他們選擇了由 Yossi Gandelsman,Assaf Shocher 和 Michal Irani 三位學者(下文中所提到的作者,均指以上三位學者)共同完成的關於 Double-DIP 模型的論文,其中詳細介紹了基於耦合的深度圖像先驗網絡對單個圖像進行無監督層分割這一技術。
  • OpenCV-Python 直方圖-2:直方圖均衡|二十七
    目標在本節中,我們將學習直方圖均衡化的概念,並利用它來提高圖像的對比度。理論考慮這樣一個圖像,它的像素值僅局限於某個特定的值範圍。例如,較亮的圖像將把所有像素限制在高值上。但是一幅好的圖像會有來自圖像所有區域的像素。
  • opencv-python圖像預處理-濾波
    為了消除外界環境對圖像採集的幹擾,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰以及提高圖像處理速度需要對圖像進行預處理操作,主要是對圖像進行濾波和增強操作。使用的方法可以分為空間域處理和頻率域處理兩類。空間域指圖像平面本身,這類圖像處理方法用各種模板直接與圖像進行卷積運算,實現對圖像的處理。
  • 一文概述用 python 的 scikit-image 模塊進行圖像分割
    而圖像分割是圖像處理中非常重要的一個步驟,它是把圖像分成若干個特定的、具有獨特性質的區域,並提取出感興趣目標的技術。近日,工程師 Parul Pandey 發表了一篇博文,在博文中,她介紹了用 python 的 scikit-image 庫進行圖像分割的方法。具體涉及 scikit-image 的安裝,圖像導入以及用監督算法和無監督算法進行圖像分割的方法。
  • CNN 在基於弱監督學習的圖像分割中的應用
    最近基於深度學習的圖像分割技術一般依賴於卷積神經網絡 CNN 的訓練,訓練過程中需要非常大量的標記圖像,即一般要求訓練圖像中都要有精確的分割結果。對於圖像分割而言,要得到大量的完整標記過的圖像非常困難,比如在 ImageNet 數據集上,有 1400 萬張圖有類別標記,有 50 萬張圖給出了 bounding box, 但是只有 4460 張圖像有像素級別的分割結果。對訓練圖像中的每個像素做標記非常耗時,特別是對醫學圖像而言,完成對一個三維的 CT 或者 MRI 圖像中各組織的標記過程需要數小時。
  • 【圖像處理】基於最小誤差法的胸片分割系統
    structure with handles and user data (see GUIDATA)if isequal(handles.I, 0) return;end% 直接二值化bw_direct = im2bw(handles.I, graythresh(handles.I));axes(handles.axes2);imshow(bw_direct, []);title('直接二值化分割
  • OpenCV(四)邊緣檢測
    邊緣檢測的方法有很多,但是絕大部分都可以分為兩大類,第一類是基於搜索,也就是通過尋找圖像一階導數中的最大值和最小值來檢測邊界,通常是定位在梯度最大的方向。其次是基於零穿越的方法,其通過尋找圖像二階導數零穿越來尋找便捷,通常是Laplacian過零點或者非線性差分表示的過零點。
  • 基於matlab圖像識別的基本操作方法(以番茄識別為例)
    番茄圖像的前期處理效果決定了番茄的識別效果,所以番茄圖像的前期處理是非常關鍵的步驟。本章將會從番茄圖像採集分類、空間濾波、彩色模型的選擇、番茄圖像分割和形態學處理方法對其進行介紹。4.1.1番茄圖像空間濾波由於拍攝的番茄圖像中往往會存在噪聲,數字番茄圖像就不能反映真實的場景。
  • 圖像處理技術是什麼_圖像處理技術現狀和發展前景
    數字圖像處理概要   數字圖像處理是將圖像信號轉換成數位訊號並利用計算機對其進行處理。起源於20世紀20年代,20世紀60年—70年隨著計算機技術與數位電視技術的普及和發展而迅速發展。在80年代——90年代才形成獨立的科學體系。