使用python-opencv在圖像中查找最亮點(diǎn)

Python,OpenCV找出圖像中的最亮點(diǎn)

這篇博客將向您展示如何使用Python和OpenCV查找圖像中的最亮點(diǎn),以及應(yīng)用單行預(yù)處理代碼——高斯模糊以改善效果。

1. 原理

查找Python和OpenCV找到圖像的最亮點(diǎn),主要利用 **cv2.minMaxLoc **方法。

使用cv2.minMaxLoc 找到的實(shí)際上不是一個(gè)區(qū)域——它只是整個(gè)圖像中最亮的單個(gè)像素。

**cv2.minMaxLoc找到的是整個(gè)圖像中單個(gè)最亮的像素。 **因此使用極易受到噪音的干擾。在正常情況下不會(huì)出現(xiàn)明亮像素的區(qū)域(在這種情況下,是視神經(jīng)中樞以外的區(qū)域),單個(gè)明亮像素會(huì)大大降低檢測的結(jié)果。

相反,最好檢查圖像的區(qū)域而不是單個(gè)像素。因?yàn)闄z查區(qū)域時(shí)可以讓所有區(qū)域平均平衡,而不易受到噪音影響。

2. 優(yōu)化

那么,如何在不顯式檢查圖像的每個(gè)區(qū)域的情況下模仿這種“區(qū)域”效果呢?

  • 查找圖像中最亮點(diǎn)的敏感方法是使用cv2.minMaxLoc,稱其敏感的原因是該方法極易受噪音干擾(其他區(qū)域明亮的像素),可以通過預(yù)處理步驟應(yīng)用 **高斯模糊 **解決。

  • 應(yīng)用高斯模糊可以對給定半徑內(nèi)的像素進(jìn)行平均,從而丟棄單個(gè)明亮像素。使魯棒性方法正常工作的一個(gè)重要方面是正確設(shè)置半徑尺寸。

  • 合理的設(shè)置高斯模糊半徑值非常的重要,正確的設(shè)置半徑尺寸能很好的保證該方法的魯棒性;

  • 如果設(shè)置半徑尺寸太小,將無法找到更大,更亮的圖像區(qū)域。但是如果設(shè)置尺寸過大,那么將檢測到太大的區(qū)域,而錯(cuò)過了較小的區(qū)域,從而導(dǎo)致結(jié)果不及預(yù)期。

3. 效果圖

原始效果 VS 高斯優(yōu)化后效果圖

在這里插入圖片描述

有噪音干擾時(shí),原始效果 VS 高斯優(yōu)化后圖

原始效果左圖 cv2.minMaxLoc 找到的只是最亮的像素點(diǎn),所以很容易受高頻噪音影響。優(yōu)化是應(yīng)用高斯模糊;


在這里插入圖片描述

原始效果 VS 高斯優(yōu)化后圖

在這里插入圖片描述

4. 源碼

# USAGE
# python bright.py --image retina.png --radius 41
# python bright.py --image images/retina-noise.png --radius 41

# 導(dǎo)入必要的包
import numpy as np # 數(shù)值處理
import argparse # 命令行參數(shù)
import cv2 #綁定openCV

# 構(gòu)建命令行參數(shù)并解析
# --image 照片路徑
#  --radius 整數(shù),應(yīng)用于圖像的高斯模糊的半徑,必須是技術(shù)
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", help = "path to the image file")
ap.add_argument("-r", "--radius", type = int,
                help = "radius of Gaussian blur; must be odd")
args = vars(ap.parse_args())

# 加載圖像,復(fù)制圖像并轉(zhuǎn)換為灰度圖
image = cv2.imread(args["image"])
orig = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 查找圖像中最亮點(diǎn)的敏感方法是使用cv2.minMaxLoc,稱其敏感的原因是該方法極易受噪音干擾,可以通過預(yù)處理步驟應(yīng)用高斯模糊解決。
# 尋找最小、最大像素強(qiáng)度所在的(x,y)
(minVal, maxVal, minLoc, maxLoc) = cv2.minMaxLoc(gray)
# 在最大像素上繪制空心藍(lán)色圓圈
cv2.circle(image, maxLoc, 5, (255, 0, 0), 2)

# 展示該方法的結(jié)果
cv2.imshow("Naive", image)

# 使用cv2.minMaxLoc,如果不進(jìn)行任何預(yù)處理,可能會(huì)非常容易受到噪音干擾。
# 相反,最好先對圖像應(yīng)用高斯模糊以去除高頻噪聲。這樣,即使像素值非常大(同樣由于噪聲)也將被其鄰居平均。
# 在圖像上應(yīng)用高斯模糊消除高頻噪聲,然后尋找最亮的像素
# 高斯模糊的半徑取決于實(shí)際應(yīng)用和要解決的問題;
gray = cv2.GaussianBlur(gray, (args["radius"], args["radius"]), 0)
(minVal, maxVal, minLoc, maxLoc) = cv2.minMaxLoc(gray)
image = orig.copy()
cv2.circle(image, maxLoc, args["radius"], (255, 0, 0), 2)

# 展示效果顯著提升后的方法結(jié)果
cv2.imshow("Robust", image)
cv2.waitKey(0)

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容