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ü:
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ü:
İ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.
Eğer dosyaların sayısı tek sayı ise grafik aşağıdaki gibi görünür.
Ç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ü:
Çok teşekkür ederim çok yardımcı oldunuz
Rica ederim, kolay gelsin.