java反向映射_opencv 直方图和直方图反向映射
histogram
使用np進行直方圖像素統計
通過histogram對圖像的三個通道分別進行一維直方圖統計,由于被統計的數組必須是一維的,所以使用ravel將二維數組轉換為一維數組,通過range參數指定統計區間為0--256,bin參數指定將統計區間分為256等分,histogram返回兩個數組hist和x,hist為統計結果,長度為bin,而x是統計區間,長度為bin+1,hist[i]的值為數組中滿足x[i]<=v
用histogram2d對通道0和通道2進行二維直方圖統計,被統計的數組是兩個一維數組,因此也需要使用ravel處理,他們分別是圖像通道0和通道2的數據,bins和ranges參數都變成了有兩個元素的序列,分別與兩個數組相對應,返回的統計結果hist2是一個二維數組,其形狀由bins決定,第0軸與第一個數組相對應,第1軸與第二個數組相對應,它是由兩個一維數組的對應元素所構成的二維矢量的分布統計結果。
統計結果中亮度比較大的 地方表示圖像中紅色值在150--200和藍色值在50-100附近的像素比較多
import cv2 as cv
import pylab as pl
import numpy as np
img = cv.imread('lena.jpg')
fig, ax = pl.subplots(1, 2, figsize=(12, 5))
colors = ['blue', 'green', 'red']
for i in range(3):
hist, x = np.histogram(img[:, :, i].ravel(), bins=256, range=(0, 256))
ax[0].plot(0.5 * (x[:-1] + x[1:]), hist, label=colors[i], color=colors[i])
ax[0].legend(loc='upper left')
ax[0].set_xlim(0, 256)
hist2, x2, y2 = np.histogram2d(
img[:, :, 0].ravel(),
img[:, :, 2].ravel(),
bins=(100, 100),
range=[(0, 256), (0, 256)]
)
ax[1].imshow(hist2, extent=(0, 256, 0, 256), origin=('lower'), cmap='gray')
ax[1].set_ylabel('blue')
ax[1].set_xlabel('red')
pl.show()
calcHist
opencv自帶的直方圖統計函數為calcHist,支持對多副圖像進行N維直方圖統計,因此第一個參數是圖像列表,對img的三個通道(0,1,2)進行三維直方圖統計,每個通道的等分數為(30,20,10),所有通道的取值范圍都為(0,256),返回結果是一個形狀為(30,20,10)的數組
import cv2 as cv
import pylab as pl
import numpy as np
img = cv.imread('lena.jpg')
result = cv.calcHist(
[img],
channels=(0, 1, 2),
mask=None,
histSize=(30, 20, 10),
ranges=(0, 256, 0, 256, 0, 256),
)
# (30, 20, 10)
print(result.shape)
直方圖反向映射
計算出直方圖后,可以使用calcBackProject將圖像中的每個點替換為他在直方圖中所對應的值,于是在直方圖中出現次數越高,圖像中對應的像素就越亮,可以使用這種方法找出圖像中和直方圖相匹配的區域
在圖像中截取需要匹配的部分,計算待匹配部分的直方圖,然后應用到目標圖片中
局部閾值二值化效果
首先載入圖片,轉為hsv色系即色相,飽和度,和明度,相對模板圖像的色相和飽和度進行二維直方圖計算,在色相和飽和度空間進行顏色匹配能夠得到比較好的匹配結果,為了后序計算像素值不溢出,進行歸一化到0--255范圍內
載入目標圖像,轉到hsv色系,將模板的統計結果匹配到目標圖像
二值化處理,可以自己設置閾值,可以使用自適應二值化
形態學處理,開閉和鵬展腐蝕操作,為了更好的找到目標區域,消除雜點
這種方法適用于在視頻中跟蹤一個顏色鮮明的物體,在跟蹤物體之前首先對一幅物體充滿整個畫面的圖像進行直方圖統計,然后對視頻的幀進行calcBackProject計算
import cv2 as cv
import numpy as np
img = cv.imread('selection2.jpg')
img_hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
cv.imshow('img', img)
cv.imshow('hsv', img_hsv)
result = cv.calcHist(
[img_hsv],
[0, 1],
None,
[40, 40],
[0, 256, 0, 256]
)
result /= np.max(result) / 255
# img2 = cv.imread('orange.jpg')
img2 = cv.imread('fruits.jpg')
cv.imshow('orange', img2)
img_hsv2 = cv.cvtColor(img2, cv.COLOR_BGR2HSV)
cv.imshow('orange hsv', img_hsv2)
img_bp = cv.calcBackProject(
[img_hsv2],
channels=[0, 1],
hist=result,
ranges=[0, 256, 0, 256],
scale=1,
)
# 自定義二值化
# _, img_th = cv.threshold(img_bp, 128, 255, cv.THRESH_BINARY_INV)
# 局部二值化,自適應閾值
# ADAPTIVE_THRESH_GAUSSIAN_C ADAPTIVE_THRESH_MEAN_C
# blockSize 必須為奇數
img_th = cv.adaptiveThreshold(img_bp, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)
cv.imshow('th', img_th)
# 核的大小和形狀
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
# 開操作
img_mp = cv.morphologyEx(img_th, cv.MORPH_OPEN, kernel, iterations=5)
cv.imshow('mp', img_mp)
cv.waitKey(0)
轉載至鏈接:https://my.oschina.net/ahaoboy/blog/1933912
總結
以上是生活随笔為你收集整理的java反向映射_opencv 直方图和直方图反向映射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: APT组织攻击常用的技术手段(APT组织
- 下一篇: 公司外汇备案为啥通不过?(公司外汇备案)