Python rgb histogramı

Merhabalar opencv kütüphanesini kullanarak webcamle çekilen anlık fotografların rgb histogramını çıkarmam lazım. Bunun için calcHist komutunu kullandım ama webcamle çekip kaydettiğim tüm fotografların değil sadece son çektiğim anlık fotografın histogramını görüyorum. Hepsinin rgb histogramını ayrı figürlerde nasıl görebilirim

Merhaba hoş geldiniz.

Aşağıdaki kodların yardımı olur mu?

import os
import cv2
import matplotlib.pyplot as plt


def show_rgb_histograms(path):
    for file in os.listdir(path):
        if file.endswith("jpg"):
            img = cv2.imread(file, 0)
            plt.hist(img.ravel(), 256, [0, 256], label=file)
    plt.legend()
    plt.show()
    
    
show_rgb_histograms(".")

Ekran görüntüsü:
Figure_1

1 Beğeni

Opencv ya da numpy kütüphanelerini kullanmam gerekiyor sadece.Os sorun çıkarabilir ödevde ama yine de teşekkür ederim yardımı olabilir

İsterseniz numpy de kullanabilirsiniz. os'u dosyalara hızlı bir şekilde erişmek için kullandım. Histogramı görüntülemek için matplotlib dışında ne kullanabilirsiniz bilmiyorum doğrusu.

import os
import cv2
import numpy as np
import matplotlib.pyplot as plt


def show_rgb_histograms(path):
    for file in os.listdir(path):
        if file.endswith("jpg"):
            img = cv2.imread(file, 0)
            hist = np.bincount(img.ravel(), minlength=256)
            # Alternatifler
            # hist = cv2.calcHist([img], [0], None, [256], [0, 256])
            # hist, bins = np.histogram(img.ravel(), 256, [0, 256])
            plt.plot(hist, label=file)
            plt.legend()
    plt.show()
    
    
    
show_rgb_histograms(".")

Ekran görüntüsü:
Figure_1

İki kodunda yardımı olucak matplotlib kullanabilirim ben de kullanmıştım kodumda teşekkür ederim

Tekrar merhaba bu kodu rgb histogramları ayrı şekilde yani bir fotografın mavi kırmızı yeşil dağılımı figure1 de ondan sonra çekilen fotoğrafın histogramı figure2 de şeklinde gösterebilir miyiz

Merhaba,

Tabi, gösterebiliriz:

#!/usr/bin/python3.8
# -*- coding: utf-8 -*-

import os
import cv2
import numpy as np
import matplotlib.pyplot as plt

from random import randrange


def rgb(r: int, g: int, b: int):
    """
    Çizgilere farklı renkler vermek için böyle bir fonksiyon 
    kullanılabilir.
    """
    return "#" + "".join(hex(i)[2:].zfill(2) for i in (r, g, b))


def show_rgb_histograms(path):
    hists = [
        [file, np.bincount(cv2.imread(file, 0).ravel(), minlength=256)]
        for file in os.listdir(path) if file.endswith("jpg")
    ]
    q, r = divmod(len(hists), 2)
    fig, ax = plt.subplots(nrows=q + r, ncols=2)
    fig.tight_layout(pad=3.0)
    count = 0
    for row in ax:
        for col in row:
            try:
                label, hist = hists[count]
                color = rgb(
                    r=randrange(0, 256), 
                    g=randrange(0, 256), 
                    b=randrange(0, 256)
                )
                col.plot(hist, label=label, color=color)
                col.legend()
                count += 1
            except IndexError:
                fig.delaxes(ax[-1][-1])
    plt.show()
    
        
show_rgb_histograms(".")

Eğer, klasörünüzdeki dosyaların sayısı çift sayı ise grafik aşağıdaki gibi görünür.

Figure_1

Eğer dosyaların sayısı tek sayı ise grafik aşağıdaki gibi görünür.

Figure_2

Çok teşekkür ederim ama neden her fotograf için rgb grafiğinde üç rengin de dağılımı görünmüyor yani her fotograf için mavi kırmızı ve yeşil rengin 0-256 piksel arası değeri daha sonra diğer fotograf için aynı şeklinde

Anladım. Kodları şöyle değiştiriyorum.

#!/usr/bin/python3.8
# -*- coding: utf-8 -*-

import os
import cv2
import numpy as np
import matplotlib.pyplot as plt


def show_rgb_histograms(path):
    hists = [
        [file, cv2.imread(file)]
        for file in os.listdir(path) if file.endswith("jpg")
    ]
    q, r = divmod(len(hists), 2)
    fig, ax = plt.subplots(nrows=q + r, ncols=2)
    fig.tight_layout(pad=3.0)
    count = 0
    for row in ax:
        for col in row:
            try:
                label, img = hists[count]
                for i, color in enumerate(("b", "g", "r")):
                    col.plot(
                        cv2.calcHist([img], [i], None, [256], [0, 256]), 
                        color=color
                    )
                    col.set_title(label)
                count += 1
            except IndexError:
                fig.delaxes(ax[-1][-1])
    plt.show()
    
        
show_rgb_histograms(".")

Ekran Görüntüsü:

Figure_1

Çok teşekkür ederim çok yardımcı oldunuz

Rica ederim, kolay gelsin.