l'étude opencv note trois

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 
def cv_show(img,name):
    b,g,r = cv2.split(img)
    img_rgb = cv2.merge((r,g,b))
    plt.imshow(img_rgb)
    plt.show()
def cv_show1(img,name):
    plt.imshow(img)
    plt.show()
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()

Histogramme

png

cv2.calcHist (images, canaux, masque, histSize, plages)
  • images : le format d'image d'origine est uint8 ou float32. Utilisez des crochets [] lors du passage d'une fonction, par exemple [img]
  • canaux : également entre crochets, la fonction indiquera l'histogramme de notre image globale. Si l'image entrante est une image en niveaux de gris, sa valeur est [0]. S'il s'agit d'une image couleur, les paramètres entrants peuvent être [0][1][2], qui correspondent respectivement à BGR.
  • masque : image de masque. Pour unifier l'histogramme de l'image entière, définissez-le sur Aucun. Mais si vous souhaitez unifier l'histogramme d'une certaine partie de l'image, créez une image de masque et utilisez-la.
  • histSize : le nombre de BIN. Utilisez également des crochets
  • plages : la plage de valeurs de pixels est généralement [0256]
img = cv2.imread('cat.jpg',0) #0表示灰度图
hist = cv2.calcHist([img],[0],None,[256],[0,256])
hist.shape
(256, 1)
plt.hist(img.ravel(),256); 
plt.show()

png

img = cv2.imread('cat.jpg') 
color = ('b','g','r')
for i,col in enumerate(color): 
    histr = cv2.calcHist([img],[i],None,[256],[0,256]) 
    plt.plot(histr,color = col) 
    plt.xlim([0,256]) 

png

opération de masque

# 创建mast
mask = np.zeros(img.shape[:2], np.uint8)
print (mask.shape)
mask[100:300, 100:400] = 255
cv_show1(mask,'mask')
(414, 500)

png

img = cv2.imread('cat.jpg', 0)
cv_show1(img,'img')

png

masked_img = cv2.bitwise_and(img, img, mask=mask)#与操作
cv_show1(masked_img,'masked_img')

png

hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])
plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask, 'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0, 256])
plt.show()

png

Égalisation d'histogramme

titre

titre

titre

img = cv2.imread('clahe.jpg',0) #0表示灰度图 #clahe
plt.hist(img.ravel(),256); 
plt.show()

png

equ = cv2.equalizeHist(img) 
plt.hist(equ.ravel(),256)
plt.show()

png

res = np.hstack((img,equ))
cv_show1(res,'res')

png

Égalisation adaptative de l'histogramme
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) 
res_clahe = clahe.apply(img)
res = np.hstack((img,equ,res_clahe))
cv_show1(res,'res')

png

correspondance de modèle

Le principe de correspondance du modèle est très similaire à celui de la convolution. Le modèle glisse de l'origine sur l'image d'origine, et le degré de différence entre le modèle et (l'endroit où l'image est couverte par le modèle) est calculé. Il existe 6 façons de calculer le degré de différence dans opencv, puis à chaque fois Les résultats calculés sont placés dans une matrice et affichés comme résultat. Si le graphique original est de taille AxB et le modèle est de taille axb, la matrice du résultat de sortie est (A-a+1)x(B-b+1)

# 模板匹配
img = cv2.imread('lena.jpg', 0)
template = cv2.imread('face.jpg', 0)
h, w = template.shape[:2] 
img.shape
(263, 263)
template.shape
(110, 85)
  • TM_SQDIFF : Le calcul des carrés est différent : plus la valeur calculée est petite, plus elle est pertinente.
  • TM_CCORR : Calculer la corrélation. Plus la valeur calculée est grande, plus elle est pertinente.
  • TM_CCOEFF : Calculez le coefficient de corrélation. Plus la valeur calculée est grande, plus elle est pertinente.
  • TM_SQDIFF_NORMED : calcule la différence carrée normalisée. Plus la valeur calculée est proche de 0, plus elle est pertinente.
  • TM_CCORR_NORMED : Calcule la corrélation normalisée. Plus la valeur calculée est proche de 1, plus elle est pertinente.
  • TM_CCOEFF_NORMED : Calcule le coefficient de corrélation normalisé. Plus la valeur calculée est proche de 1, plus elle est pertinente.

Officiel : https://docs.opencv.org/3.3.1/df/dfb/group__imgproc__object.html#ga3a7850640f1fe1f58fe91a2d7583695d

methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
           'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
res = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)
res.shape
(154, 179)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) #值越小越好
min_val
39168.0
max_val
74403584.0
min_loc
(107, 89)
max_loc
(159, 62)
for meth in methods:
    img2 = img.copy()

    # 匹配方法的真值
    method = eval(meth)
    print (method)
    res = cv2.matchTemplate(img, template, method)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

    # 如果是平方差匹配TM_SQDIFF或归一化平方差匹配TM_SQDIFF_NORMED,取最小值
    if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)

    # 画矩形
    cv2.rectangle(img2, top_left, bottom_right, 255, 2)

    plt.subplot(121), plt.imshow(res, cmap='gray')
    plt.xticks([]), plt.yticks([])  # 隐藏坐标轴
    plt.subplot(122), plt.imshow(img2, cmap='gray')
    plt.xticks([]), plt.yticks([])
    plt.suptitle(meth)
    plt.show()
4

png

5

png

2

png

3

png

0

png

1

png

Faire correspondre plusieurs objets

img_rgb = cv2.imread('mario.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('mario_coin.jpg', 0)
h, w = template.shape[:2]

res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
# 取匹配程度大于%80的坐标
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):  # *号表示可选参数
    bottom_right = (pt[0] + w, pt[1] + h)
    cv2.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 2)

cv_show(img_rgb,'img_rgb')

png


Je suppose que tu aimes

Origine blog.csdn.net/weixin_41756645/article/details/125464915
conseillé
Classement