Lesen von BMP-Bildern mithilfe der Image- und cv2-Bibliotheken

Zu diesen Inhalten gehören das Lesen und Schreiben von Bildern sowie „Bildfusion“, „Bildspleißen“ und „Graustufenhistogrammanzeige von Bildern“.

1. Lesen von BMP-Bildern

Verwenden Sie Bilder im BMP-Format mit einer Tiefe von 8 Bit und 24 Bit und speichern Sie sie im Ordner „file“, um BMP-Bilder mit 8 und 24 Bit zu lesen und zu speichern und die entsprechenden Graustufenhistogramme zu zeichnen.

(1) Importieren Sie die Standardbibliothek numpy und weisen Sie sie dem Objekt np zur Datenberechnung und -verarbeitung zu.
(2) Importieren Sie das Visualisierungsmodul matplotlib.pyplot und weisen Sie es dem Objekt plt zu, das zum Zeichnen von Visualisierungsbildern verwendet wird.
(3) Importieren Sie die Bibliothek matplotlib eines Drittanbieters, um die Bildverarbeitungsfunktion in der Bibliothek aufzurufen.
(4) Importieren Sie das Standardbibliotheksbetriebssystem für Datei- und Verzeichnisoperationen.
(5) Importieren Sie die Entpackbibliothek aus dem Strukturmodul. Das Strukturmodul wird zum Parsen von Bytedaten verwendet. Die Entpackbibliothek wird zum Konvertieren des Bytestroms in einen Python-Datentyp verwendet. Der Rückgabewert ist ein Tupel.
 # 标准库,用于数据计算和处理
import numpy as np
 # 可视化模块,用于绘制可视化图像
import matplotlib.pyplot as plt
 # 第三方库
import matplotlib
 # 标准库,用于文件和目录操作
import os
 # struct模块用于解析字节数据,unpack库用于将字节流转换成python数据类型,返回值为元组
from struct import  unpack
(6) Importieren Sie die Bildbibliothek aus dem Bildverarbeitungsmodul PIL eines Drittanbieters, um Bilder zu lesen.
(7) Importieren Sie die CV2-Bibliothek zum Lesen von Bildern.
(8) Verwenden Sie die Öffnungsfunktion der Bildbibliothek, um das 24-Bit-BMP-Bild zu lesen und der Variablen im_24 zuzuweisen. Verwenden Sie die Methode show () und die Funktion imshow des Visualisierungsmoduls, um das Bild anzuzeigen. Das Visualisierungsmodul ist Wird verwendet, um das Bild im Ausgabefeld auszugeben. Verwenden Sie die Methode save (), um das Bild zu speichern und den Bildnamen auf „im_24.jpg“ festzulegen.
(9) Verwenden Sie die imread-Funktion der cv2-Bibliothek, um das 8-Bit-BMP-Bild zu lesen und der Variablen im_8 zuzuweisen. Verwenden Sie die imshow-Funktion der cv2-Bibliothek, um das Bild anzuzeigen, und setzen Sie den Fensternamen auf „im_8“. Verwenden Sie die Figure-Funktion des Visualisierungsmoduls, um die Leinwand zu erstellen, und die Imshow-Funktion. Geben Sie das Bild aus. Verwenden Sie die Imwrite-Funktion der CV2-Bibliothek, um das Bild zu speichern, und setzen Sie den Bildnamen auf „im_8.jpg“.
(10) Erstellen Sie eine Reihe von for-Schleifen. Das Schleifenobjekt ist range (4) und die Schleifenvariable ist i.
①Erstellen Sie 4 Unterplots mit der Funktion plt.subplot(1,4,i+1).
② Zeigen Sie das Graustufenbild über die Funktion plt.imshow(pictures[i],'gray') an.
③ Legen Sie den Titel des Bildes über die Funktionen plt.title(titles[i]), plt.xticks([]), plt.yticks([]) fest und entfernen Sie die numerischen Koordinaten auf der horizontalen und vertikalen Achse.
(11) Zeigen Sie den gezeichneten Untergraphen über die Funktion plt.show() an.
from PIL import Image  # 用于读取图像
import cv2  # 用于读取图像
# 读取24位BMP
im_24 = Image.open('./file/24bits.bmp')
#显示图像
plt.imshow(im_24)
#以jpg格式进行存储
im_24.save('im_24.jpg')

# 读取8位BMP
im_8 =  cv2.imread('./file/8bits.bmp')
#显示图像
cv2.imshow('im_8',im_8)
# 设置图片展示时间
cv2.waitKey()
# 释放内存
cv2.destroyAllWindows()

plt.figure()
plt.imshow(im_8)
cv2.imwrite('im_8.jpg',im_8)
# 设置图片标题
titles = ['24bits','8bits']
pictures = [im_24,im_8]
 # 灰度图、idc变换图、高频信息图、增强高频信息后的图

# 设置画布大小
plt.figure(6, figsize=(16, 8))
for i in range(2):
    # 绘制子图
    plt.subplot(1,2,i+1)
    # 绘制图片
    plt.imshow(pictures[i],'gray')
    # 设置标题,并去除横纵坐标轴上的数字坐标
    plt.title(titles[i]), plt.xticks([]), plt.yticks([])
plt.show()
(12) Lesen Sie „24bits.bmp“ und „8bits.bmp“ und zeigen Sie deren Histogramme an.
(1) Definieren Sie die Rgb2gray-Funktion
#定义Rgb2gray函数
def Rgb2gray(image):
    h = image.shape[0]
    w = image.shape[1]
    grayimage  = np.zeros((h,w),np.uint8)
    for i in tqdm(range(h)):
        for j in range(w):
            #Gray = R*0.299 + G*0.587 + B*0.114.
            gray =h*0.299+w*0.587
    return grayimage
(2) Bilder importieren und Histogramme zeichnen
from PIL import Image
from pylab import *
import cv2
from tqdm import tqdm
# 读取24bits.bmp图像到数组中,并灰度化
image = cv2.imread('./file/24bits.bmp')
im = array(Image.open('./file/24bits.bmp').convert('L'))
# 直方图图像
# flatten可将二维数组转化为一维
hist(image.flatten(), 128)
# 显示
show() 

# 读取8bits.bmp图像到数组中,并灰度化
image = cv2.imread('./file/8bits.bmp')
im = Rgb2gray(image)
# 直方图图像
# flatten可将二维数组转化为一维
hist(image.flatten(), 128)
# 显示
show()

Schreiben von BMP-Bildern

(1) Importieren Sie die Bildbibliothek aus dem Bildverarbeitungsmodul PIL eines Drittanbieters, um die Bildverarbeitungsmethode aufzurufen.
(2) Importieren Sie das Visualisierungsmodul matplotlib.pyplot und weisen Sie es dem Objekt plt zur Anzeige von Bildern zu.
(3) Importieren Sie das Standardbibliotheksbetriebssystem für Datei- und Verzeichnisoperationen.
(4) Importieren Sie die CV2-Bibliothek für Bildverarbeitung und Vorgänge.
(5) Verwenden Sie die Öffnungsfunktion der Bildbibliothek, um das lokale Echtfarbenbild, also das BMP-Bild mit einer Tiefe von 24 Bit, zu lesen und es der Variablen im_24 zuzuweisen.
(6) Verwenden Sie die Imshow-Funktion des Visualisierungsmoduls, um das Bild anzuzeigen.
# 用于调用图像处理方法
from PIL import Image
 # 用于显示图像
import matplotlib.pyplot as plt
# 用于文件和目录操作
import os
# 用于图像处理和操作
import cv2
# 读取本地真彩色图片
im_24 = Image.open('24.bmp')
# 显示图片
plt.imshow(im_24)
(7) Verwenden Sie die Methode „convert()“ des Objekts im_24, um die Konvertierung des Bildformats zu implementieren. Setzen Sie den Parameter auf „L“, um das Bild in ein graues Bild umzuwandeln. Jedes Pixel wird durch 8 Bytes dargestellt, 0 steht für Schwarz, 255 steht für Weiß, und andere. Die Zahlen repräsentieren unterschiedliche Graustufen und werden der Variablen Lim zugewiesen.
(8) Verwenden Sie die Imshow-Funktion des Visualisierungsmoduls, um das Bild anzuzeigen, legen Sie den Parameter „Gray“ fest, um die Graustufenbildanzeige zu realisieren, speichern Sie das Bild mit der Methode save () und nennen Sie es „24bit_grayscale.jpg“.
(9) Verwenden Sie die Konvertierungsfunktion und setzen Sie den Parameter auf „1“, um das Bild in ein Binärbild, entweder schwarz oder weiß, umzuwandeln. Jedes Pixel wird durch 8 Bytes dargestellt, 0 steht für Schwarz, 255 steht für Weiß und wird dem zugewiesen Variable Bim. ;Verwenden Sie die Figure-Funktion des Visualisierungsmoduls, um eine Leinwand zu erstellen, das Bild anzuzeigen und zu speichern und es „24bit_binary.jpg“ zu nennen.
(10) Definieren Sie eine Schleife, verwenden Sie die Bereichsfunktion zum Durchlaufen, setzen Sie den Wert auf 256. Wenn der Wert kleiner als der definierte Variablenschwellenwert ist, füllen Sie die Liste mit dem Wert „0“, andernfalls füllen Sie den Wert „1“.
(11) Verwenden Sie die point()-Methode des Objekts Lim und setzen Sie die Parameter auf „table“ und „1“, um das Bild über die Konvertierungstabelle mit einem konstanten Schwellenwert in ein Binärbild umzuwandeln. Erstellen Sie eine Leinwand, zeigen Sie sie an und speichern Sie sie Bild und nennen Sie es „24bit_binary.png“.
# 转换为灰度图像(8位)# 灰度化,8位像素,黑白
#显示为灰度图像
Lim = im_24.convert('L')
plt.figure(figsize=(4,4))
plt.imshow(Lim,'gray')
#matplotlib.pyplot.imshow(X, cmap=None),cmap:颜色图谱(colormap), 默认绘制为RGB(A)颜色空间
# 保存的灰度化图片,jpg形式
im_24.save('24bit_灰度.jpg')
# 转换为二值图像(1位)# 1位像素,黑白,每个字节一个像素存储
Bim = im_24.convert('1')
#创建第二个figure
plt.figure(figsize=(4,4))
#显示图像
plt.imshow(Bim)
#保存为jpg格式图片
Bim.save('24bit_二值.jpg')
# 设置一个带有常量阈值的转换表
threshold = 185
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
# 通过表格转换为二进制图像
img = Lim.point(table,'1')
#创建第三个figure
plt.figure(figsize=(4,4))
#显示灰度图像
plt.imshow(img,'gray')
#保存png格式图片
img.save('24bit_二进制.png')
(12) Konstruieren Sie die Spleißfunktion
def image_compose():
  # 创建一个新图
    to_image = Image.new('RGB', (IMAGE_COLUMN * IMAGE_SIZE, IMAGE_ROW * IMAGE_SIZE))
    # 循环遍历,把每张图片按顺序粘贴到对应位置上
    for y in range(1, IMAGE_ROW + 1):
        for x in range(1, IMAGE_COLUMN + 1):
            from_image = Image.open(IMAGES_PATH + image_names[IMAGE_COLUMN * (y - 1) + x - 1]).resize(
                (IMAGE_SIZE, IMAGE_SIZE), Image.ANTIALIAS)
            to_image.paste(from_image, ((x - 1) * IMAGE_SIZE, (y - 1) * IMAGE_SIZE))
    plt.imshow(to_image)
    return to_image.save("拼接结果.jpg")  # 保存拼接之后的结果图
(13) Definieren Sie Parameter und rufen Sie die Spleißfunktion auf
# 图片集地址
IMAGES_PATH = 'img/'
# 图片格式
IMAGES_FORMAT = ['.bmp','.jpg']
# 每张小图片的大小为256
IMAGE_SIZE = 256 
# 图片间隔,也就是合并成一张图后,一共有几行
IMAGE_ROW = 2
# 图片间隔,也就是合并成一张图后,一共有几列
IMAGE_COLUMN = 2
# 获取图片集地址下的所有图片名称
image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT if
               os.path.splitext(name)[1] == item]
print(image_names)
# 简单的对于参数的设定和实际图片集的大小进行数量判断
l=len(image_names)
if l!=IMAGE_SIZE*IMAGE_COLUMN:
    print('错误')
image_compose()  # 调用函数
(14) Bildfusion und Überlagerung
import cv2  # 用于图像处理和操作
#采用cv2读取24.bmp图像
img1 = cv2.imread('24.bmp')
img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
#采用cv2读取1.jpg图像
img2 = cv2.imread('1.jpg')
# 调整大小为(300,300)
img2 = cv2.resize(img2,(300,300))
# 获取矩阵行、列和维度
    #rows = img2.shape[0]
    #cols = img2.shape[1]
    #channels = img2.shape[2]
rows,cols,channels = img2.shape
roi = img1[0:rows,0:cols]
dst = cv2.addWeighted(img2, 0.9, roi, 0.1, 0)#图像融合
dst1 = img1.copy()#对原图像进行拷贝
dst1[0:rows,0:cols] = dst

plt.imshow(dst1)
plt.show()

cv2.imshow('dst',dst)#查看融合结果
cv2.imshow('reusult',dst1)#显示处理后的结果
#保存为reusult.jpg
cv2.imwrite('reusult.jpg',dst1)
# 设置图片展示时间
cv2.waitKey()
# 释放内存
cv2.destroyAllWindows()
"""
cv2.imshow()和plt.imshow()的区别
如果需要展示读入的图像,或者展示对读入图像进行一系列操作后的图像时,使用cv2.imshow()
如果不需要展示原始图像,而是绘制一张新的图像,使用plt.imshow()
注意
opencv是BGR通道,plt默认RGB通道,若使用cv2.imread()读入图像,用plt.imshow()展示原始图像或者展示对读入图像进行一系列操作后的图像时,
需要进行通道转换。
在展示灰度图像时,cv2.imshow(‘gray’, gray)
plt.imshow(gray,cmap=‘gray’), plt.title(‘gray’)
"""

Es hat mich viel Zeit gekostet, den gesamten Code abzutippen. Ich habe einige der Schwierigkeiten zusammengefasst (nur für mich):

1. Bildfusion und Überlagerung

Als ich über diesen Teil nachdachte, war ich völlig verwirrt. Ich habe auch viele Informationen im Internet gefunden, aber keine davon hat das Arbeitsproblem gelöst. Später fand ich die Lösung, nachdem ich den Code gesehen hatte, den ein Freund in der Vergangenheit geschrieben hatte .

Das erste ist das Verständnis der Funktion cv2.addWeighted((img2, 1, roi, 0.1, 0).

img2 Das Gewicht beträgt 0,9, das ROI-Gewicht beträgt 0,1 und der Vergütungsbetrag beträgt 0. Die Funktion des Kompensationsbetrags ist die Helligkeitsanpassung.

Zweitens habe ich zum Vergleich die Codezeile roi = img1[0:rows,0:cols] ausgeführt.

Es kann gefunden werden, indem die Ergebnisse ausgeführt werden

roi ist eine Ecke mit der gleichen Größe wie Bild img1

dst ist das Ergebnis der Fusion von roi und img2

Das Endergebnis besteht darin, r und g von dst (fusioniert) über dst1 (dh img1) zu kopieren, sodass die Situation im Bild angezeigt wird.

Das zweite Problem ist die Farbe oben

Als ich plt.show und cv2.imshow gleichzeitig verwendete, waren die Ergebnisse unterschiedlich. Nach der Abfrage stellte ich fest, dass die beiden Standardkanäle unterschiedlich waren.

opencv ist ein BGR-Kanal und plt verwendet standardmäßig den RGB-Kanal. Wenn Sie cv2.imread() verwenden, um ein Bild zu lesen, verwenden Sie plt.imshow(), um das Originalbild anzuzeigen, oder zeigen Sie das Bild nach einer Reihe von Vorgängen am gelesenen Bild an , müssen Sie eine Kanalkonvertierung durchführen.


おすすめ

転載: blog.csdn.net/YYANyk/article/details/129693148