Python Computer Vision-Image Processing Fundamentals Chapitre 1 Histogramme, filtrage gaussien, égalisation d'histogramme


Préface

Avant de mettre le blog d'apprentissage dans le jardin du blog, le lien est le suivant:
lien du jardin du blog . Je
viens de rencontrer la défaillance du système du jardin du blog et la raison des faibles pages vues, j'ai donc décidé de le mettre à jour avec CSDN.

Dans le cours sur l'image numérique au dernier semestre, nous avons d'abord abordé le cours du traitement d'image numérique. La différence est que le dernier semestre, nous avons utilisé matlab pour réaliser le traitement d'image de base, tandis que dans ce cours, nous utilisons python + opencv pour réaliser le traitement d'image. .
J'utilise Pycharm pour programmer.
Matériaux de l'ouvrage de référence: Programmation de la vision par ordinateur Python


1. Image en échelle de gris?

La relation logarithmique entre le blanc et le noir est divisée en plusieurs niveaux, appelés niveaux de gris. L'échelle de gris est divisée en 256 niveaux.
Une image exprimée en niveaux de gris est appelée une image en niveaux de gris.
Toute couleur est composée des trois couleurs primaires (RVB) de rouge, vert et bleu, et l'image en niveaux de gris n'a qu'un seul canal avec 256 niveaux de gris, 255 représente tout le blanc et 0 représente tout le noir.
En plus des images satellites et des photos aériennes courantes, de nombreuses données d'observation géophysique sont également exprimées en niveaux de gris.

Introduction du principe:

La méthode convert () est utilisée pour réaliser la conversion des couleurs de l'image. Le
principe de la fonction convert ('L') dans PIL:

  • img = img.convert ()
    PIL a neuf modes différents: 1, L, P, RVB, RVBA, CMJN, YCbCr, I, F.

  • img.convert ('1')
    est une image binaire, noire ou blanche. Chaque pixel est représenté par 8 bits, 0 signifie noir et 255 signifie blanc.

  • img.convert ('L') #Le code utilisé dans le code suivant est
    une image en niveaux de gris. Chaque pixel est représenté par 8 bits, 0 représente le noir, 255 représente le blanc et les autres nombres représentent différents niveaux de gris.
    Formule de conversion: L = R * 299/1000 + G * 587/1000 + B * 114/1000.

Affichage du code:

# -*- codeing =utf-8 -*-
# @Time : 2021/3/7 15:16
# @Author : ArLin
# @File : demo1灰度图.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *


# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
figure()


pil_im = Image.open('data/001.jpg')
gray()# 不使用颜色信息
subplot(121)
title(u'原图',fontproperties=font)
axis('off')
imshow(pil_im)


pil_im = Image.open('data/001.jpg').convert('L')
subplot(122)
title(u'灰度图',fontproperties=font)
axis('off')
imshow(pil_im)


show()

Affichage des résultats:

Insérez la description de l'image ici

Contour de l'image et histogramme

Contour de l'image:

Un contour est une courbe composée d'une série de points connectés, qui représente la forme de base d'un objet. Par rapport au bord, le contour est continu et les bords ne sont pas tous continus.
L'opération de recherche de contours est généralement utilisée pour les images binarisées, donc la segmentation de seuil ou la détection de bord Canny est généralement utilisée pour obtenir les images binarisées en premier.

Histogramme:

L'histogramme est une illustration qui peut donner une compréhension globale de la distribution des niveaux de gris de l'image entière. Grâce à l'histogramme, nous pouvons avoir une compréhension intuitive du contraste, de la luminosité et de la distribution des niveaux de gris de l'image.
L'histogramme de l'image est utilisé pour caractériser la distribution des valeurs de pixels de l'image. Un certain nombre de cases sont utilisées pour spécifier la plage de valeurs de pixels caractéristiques, et chaque case recevra le nombre de pixels qui entrent dans la plage de la case.

Introduction du principe:

1. Dessiner le contour: étant
donné que le dessin du contour nécessite de définir un seuil pour la valeur de pixel de chaque coordonnée [x, y], l'image doit d'abord être grisée.

2. Dessinez un histogramme:
utilisez l'outil de dessin plt.hist () fourni avec Matplotlib pour dessiner.

Affichage du code:

# -*- codeing =utf-8 -*-
# @Time : 2021/3/8 15:09
# @Author : ArLin
# @File : demo4图像轮廓和直方图.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *


# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"d:\JsVison\font\SimSun.ttc", size=14)
im = array(Image.open('data/001.jpg').convert('L'))  # 打开图像,并转成灰度图像,读取图像到数组中

#图像轮廓
figure()
subplot(121)
gray()# 不使用颜色信息
contour(im, origin='image')# 在原点的左上角显示轮廓图像
axis('equal')
axis('off')
title(u'图像轮廓', fontproperties=font)

#图像直方图
subplot(122)
hist(im.flatten(), 128)
title(u'图像直方图', fontproperties=font)
plt.xlim([0,260])
plt.ylim([0,11000])


show()

Démonstration des résultats:

Insérez la description de l'image ici

2. Égalisation de l'histogramme

Une bonne image est généralement répartie uniformément sur l'histogramme et l'égalisation de l'histogramme est utilisée pour améliorer la luminosité et le contraste globaux de l'image.

L'égalisation d'histogramme fait référence à l'aplatissement de l'histogramme en niveaux de gris d'une image afin que la probabilité de distribution de chaque valeur de niveaux de gris dans l'image transformée soit la même. Avant de poursuivre le traitement de l'image, l'égalisation d'histogramme est généralement un très bon moyen de normaliser la valeur de gris de l'image, et elle peut améliorer le contraste de l'image.

La fonction de transformation de l'égalisation d'histogramme est la fonction de distribution cumulative des valeurs de pixel dans l'image (fonction de distribution cumulative, abrégée en cdf, une opération de normalisation qui mappe la plage de valeurs de pixels à la plage cible).

La réalisation concrète de l'égalisation d'histogramme (fonction dans imtools):

Il y a deux paramètres d'entrée dans cette fonction, l'un est l'image grise et l'autre est le nombre de cellules utilisées dans l'histogramme.
La fonction renvoie l'image égalisée de l'histogramme et la fonction de distribution cumulative utilisée pour le mappage des valeurs de pixel.
Notez que le dernier élément de la fonction de distribution cumulative (indice -1) est utilisé dans la fonction pour la normaliser dans la plage de 0 à 1.

def histeq(im,nbr_bins=256):
""" 对一幅灰度图像进行直方图均衡化"""
# 计算图像的直方图
imhist,bins = histogram(im.flatten(),nbr_bins,normed=True)
cdf = imhist.cumsum() # cumulative distribution function
cdf = 255 * cdf / cdf[-1] # 归一化
# 使用累积分布函数的线性插值,计算新的像素值
im2 = interp(im.flatten(),bins[:-1],cdf)
return im2.reshape(im.shape), cdf

Affichage du code:

# -*- codeing =utf-8 -*-
# @Time : 2021/3/8 15:17
# @Author : ArLin
# @File : demo8直方图均衡化.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from PCV.tools import imtools


# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"d:\JsVison\font\SimSun.ttc", size=14)


im = array(Image.open('data/001.jpg').convert('L'))  # 打开图像,并转成灰度图像
im2, cdf = imtools.histeq(im) #上述详解imtools.histeq函数


figure()
subplot(2, 2, 1)
axis('off')
gray()
title(u'原始图像', fontproperties=font)
imshow(im)


subplot(2, 2, 2)
axis('off')
title(u'直方图均衡化后的图像', fontproperties=font)
imshow(im2)


subplot(2, 2, 3)
axis('off')
title(u'原始直方图', fontproperties=font)
hist(im.flatten(), 128, density=True)


subplot(2, 2, 4)
axis('off')
title(u'均衡化后的直方图', fontproperties=font)
hist(im2.flatten(), 128, density=True)


show()

Affichage des résultats:

Comme le montre la figure, le contraste de l'image est amélioré après l'égalisation de l'histogramme et les détails de la zone grise de l'image d'origine deviennent clairs.
Insérez la description de l'image ici

Les problèmes rencontrés:

Il y a une erreur dans le code source affiché au cours du livre en utilisant la programmation d'apprentissage de la vision par ordinateur Python.
VisibleDeprecationAvertissement: La transmission de normed=Truecasiers non uniformes a toujours été rompue et ne calcule ni la fonction de densité de probabilité ni la fonction de masse de probabilité. result n'est correct que si les bins sont uniformes, lorsque densité = True produira le même résultat de toute façon. L'argument sera supprimé dans une future version de numpy.
hist, _ = np.histogram (lbp, normed = True, bins = max_bins , plage = (0, max_bins))

Solution: remplacer normé par densité

Le mot-clé normed est obsolète dans Numpy 1.6 car il peut provoquer une confusion / un comportement de bogue. Il sera supprimé dans Numpy 2.0. À la place, utilisez le mot-clé densité pour remplacer.

Trois, filtrage gaussien

Le filtrage gaussien est un filtre de lissage linéaire, qui convient pour éliminer le bruit gaussien et est largement utilisé dans le processus de débruitage du traitement d'image.
En termes simples, le filtrage gaussien est le processus de moyennage pondéré de l'image entière. La valeur de chaque pixel est obtenue par moyennage pondéré de lui-même et d'autres valeurs de pixel dans le voisinage.

Introduction du principe:

L'opération spécifique du filtrage gaussien est de balayer chaque pixel de l'image avec un modèle (ou convolution, masque), et d'utiliser la valeur de gris moyenne pondérée des pixels dans le voisinage déterminée par le modèle pour remplacer la valeur du pixel central de le gabarit.
Insérez la description de l'image ici
Insérez la description de l'image ici

Le filtrage est un processus de traitement par convolution sur le signal d'entrée. Il est écrit sous la forme d'une fonction comme celle-ci:
Filtre = Convolution (signal d'entrée, modèle de convolution) La différence du modèle / masque de convolution détermine les différentes méthodes de filtrage. Par conséquent, des méthodes de filtrage de base telles que passe-haut, passe-bas, passe-bande et coupe-bande sont produites.

Pour le filtrage passe-bas, la partie basse fréquence du signal est réservée et la partie haute fréquence est supprimée. Pour atteindre cet objectif, vous pouvez utiliser le masque moyen, le masque gaussien, etc. pour traiter le signal d'entrée.

La méthode de filtrage qui utilise le masque moyen pour convoluer le signal d'entrée est appelée filtrage moyen; la méthode de filtrage qui
utilise le masque gaussien pour convoluer le signal d'entrée est appelée filtrage gaussien;

Filtrage gaussien et flou gaussien:

même. Sans le qualificatif «Gauss», la portée du filtrage est beaucoup plus large que le flou, et ce dernier n'est qu'un sous-ensemble du premier. Lorsque la limite "Gauss" est ajoutée, l'opération de convolution à laquelle il est fait référence est la même opération, car selon l'équation filtrage = convolution (signal d'entrée, modèle de convolution), lorsque le signal d'entrée et le modèle de convolution des deux opérations sont tous deux au Dans le même temps, ces deux opérations sont une opération,
c'est parce que l'effet de filtrage ressemble à un flou de l'image, il est donc appelé à nouveau "Flou gaussien".

SciPy (http://scipy.org/) est une boîte à outils open source pour les opérations numériques basées sur NumPy. SciPy fournit de nombreuses opérations efficaces qui peuvent réaliser l'intégration numérique, l'optimisation, les statistiques, le traitement du signal et les fonctions de traitement d'image les plus importantes pour nous. Ensuite, cette section présentera un grand nombre de modules utiles dans SciPy. SciPy est une boîte à outils open source, qui peut être téléchargée à partir de http://scipy.org/Download.
Insérez la description de l'image ici

Affichage du code:

# -*- codeing =utf-8 -*-
# @Time : 2021/3/8 15:29
# @Author : ArLin
# @File : demo10高斯模糊.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from scipy.ndimage import filters


# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"d:\JsVison\font\SimSun.ttc", size=14)


#im = array(Image.open('board.jpeg'))
im = array(Image.open('data/004.jpg').convert('L'))


figure()
gray()
axis('off')
subplot(1, 4, 1)
axis('off')
title(u'原图', fontproperties=font)
imshow(im)


for bi, blur in enumerate([2, 5, 10]):
  im2 = zeros(im.shape)
  im2 = filters.gaussian_filter(im, blur)
  im2 = np.uint8(im2)
  imNum=str(blur)
  subplot(1, 4, 2 + bi)
  axis('off')
  title(u'标准差为'+imNum, fontproperties=font)
  imshow(im2)


#如果是彩色图像,则分别对三个通道进行模糊
#for bi, blur in enumerate([2, 5, 10]):
#  im2 = zeros(im.shape)
#  for i in range(3):
#    im2[:, :, i] = filters.gaussian_filter(im[:, :, i], blur)
#  im2 = np.uint8(im2)
#  subplot(1, 4,  2 + bi)
#  axis('off')
#  imshow(im2)


show()

Affichage des résultats:

L'image montre le degré auquel une image est floue lorsque σ augmente. Plus σ est grand, plus les détails de l'image traitée seront perdus.
Insérez la description de l'image ici


Quatre, résumé

Ce qui précède est le contenu dont il faut parler aujourd'hui. Cet article ne présente que brièvement l'utilisation de l'histogramme, du filtrage gaussien et de l'égalisation d'histogramme. En fait, cet article est également un cours d'introduction pour le cours de vision par ordinateur de l'auteur.J'espère que je pourrai obtenir plus de croissance et de récolte dans l'étude suivante.

Je suppose que tu aimes

Origine blog.csdn.net/qq_43741419/article/details/115279917
conseillé
Classement