图像区域的直方图

问题描述 投票:0回答:1

我想在python中获得numpy图像中某个区域的直方图。我找到了如何使用面膜qazxsw poi的解决方案

这个解决方案没有帮助我,因为如果我使用它我会丢失实际的黑色像素数。此外,我想要的区域不一定是矩形。

python numpy opencv image-processing roi
1个回答
4
投票

要计算直方图,请使用here.函数。它返回直方图和分档。因此,您可以存储结果并使用它:

np.histogram

如果你想绘制结果,你可以在使用hist, bins = np.histogram(arr, bins=bins, range=range) simply传递plt.barnp.histogram之后使用bins

hist

另一个选择是使用plt.bar(bins, hist) matplotlib它计算直方图并从原始数据绘制它:

plt.hist

以下是任何形状的图像区域直方图的完整示例:

码:

plt.hist(arr, bins=bins)

输出:

import numpy as np import matplotlib.pyplot as plt from scipy.misc import face from PIL import Image, ImageDraw # Let's create test image with different colors img = np.zeros((300, 300, 3), dtype=np.uint8) img[0:150, 0:150] = [255, 0, 0] img[0:150, 150:] = [0, 255, 0] img[150:, :150] = [0, 0, 255] img[150:, 150:] = [255, 255, 255] # define our function for preparing mask def prepare_mask(polygon, image): """Returns binary mask based on input polygon presented as list of coordinates of vertices Params: polygon (list) - coordinates of polygon's vertices. Ex: [(x1,y1),(x2,y2),...] or [x1,y1,x2,y2,...] image (numpy array) - original image. Will be used to create mask of the same size. Shape (H, W, C). Output: mask (numpy array) - boolean mask. Shape (H, W). """ # create an "empty" pre-mask with the same size as original image width = image.shape[1] height = image.shape[0] mask = Image.new('L', (width, height), 0) # Draw your mask based on polygon ImageDraw.Draw(mask).polygon(polygon, outline=1, fill=1) # Covert to np array mask = np.array(mask).astype(bool) return mask def compute_histogram(mask, image): """Returns histogram for image region defined by mask for each channel Params: image (numpy array) - original image. Shape (H, W, C). mask (numpy array) - boolean mask. Shape (H, W). Output: list of tuples, each tuple (each channel) contains 2 arrays: first - computed histogram, the second - bins. """ # Apply binary mask to your array, you will get array with shape (N, C) region = image[mask] red = np.histogram(region[..., 0].ravel(), bins=256, range=[0, 256]) green = np.histogram(region[..., 1].ravel(), bins=256, range=[0, 256]) blue = np.histogram(region[..., 2].ravel(), bins=256, range=[0, 256]) return [red, green, blue] def plot_histogram(histograms): """Plots histogram computed for each channel. Params: histogram (list of tuples) - [(red_ch_hist, bins), (green_ch_hist, bins), (green_ch_hist, bins)] """ colors = ['r', 'g', 'b'] for hist, ch in zip(histograms, colors): plt.bar(hist[1][:256], hist[0], color=ch) # Create some test masks red_polygon = [(50, 100), (50, 50), (100, 75)] green_polygon = [(200, 100), (200, 50), (250, 75)] blue_polygon = [(50, 250), (50, 200), (100, 225)] white_polygon = [(200, 250), (200, 200), (250, 225)] polygons = [red_polygon, green_polygon, blue_polygon, white_polygon] for polygon in polygons: mask = prepare_mask(polygon, img) histograms = compute_histogram(mask, img) # Let's plot our test results plt.figure(figsize=(10, 10)) plt.subplot(221) plt.imshow(img) plt.title('Image') plt.subplot(222) plt.imshow(mask, cmap='gray') plt.title('Mask') plt.subplot(223) plot_histogram(histograms) plt.title('Histogram') plt.show() enter image description here enter image description here enter image description here

浣熊的最终测试:

码:

enter image description here

输出:

raccoon = face() polygon = [(200, 700), (150, 600), (300, 500), (300, 400), (400, 500)] mask = prepare_mask(polygon, raccoon) histograms = compute_histogram(mask, raccoon) plt.figure(figsize=(10, 10)) plt.subplot(221) plt.imshow(raccoon) plt.title('Image') plt.subplot(222) plt.imshow(mask, cmap='gray') plt.title('Mask') plt.subplot(223) plot_histogram(histograms) plt.title('Histogram') plt.show()

© www.soinside.com 2019 - 2024. All rights reserved.