您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
(corrcoef)-matlabxcorr计算过程
颜色,图像,灰度(corrcoef)-matlabxcorr计算过程
发布时间:2020-12-06加入收藏来源:互联网点击:
很多朋友想了解关于corrcoef的一些资料信息,下面是小编整理的与corrcoef相关的内容分享给大家,一起来看看吧。
本文共7500字,建议阅读15+分钟
我们将探讨特征工程的不同方式如何有助于提高卷积神经网络的分类能。
并非所有彩色的图像都应该是彩色的,或者换句话说并非所有使用 RGB(红、绿、蓝)编码的图像都应该使用这些颜色!在本文中,我们将探讨特征工程的不同方式(将原始颜色值进行展开)如何有助于提高卷积神经网络的分类能。
有多种方法可以更改和调整 RGB 图像的颜色编码(例如,将 RGB 转换为 HSV、LAB 或 XYZ 值;scikit-image 提供了许多很棒的例程来执行此操作) - 但是本文不是关于此的,而更多的是思考数据试图捕获什么以及如何利用它。
数据集为了更好地突出本文的目的,让我们看一下以下三个数据集(每张图像显示该数据集中的 100 张单独图像):
这三个数据集是 MedMNIST 数据集的一部分——图像取自相应的论文。
这些数据集的共同点是,来自给定数据集的单个图像都有其特定的颜色范围。虽然粉红色或红色色调存在波动,但对于这些图像中的大多数,图像之间的对比度差异比实际 RGB 颜色值所代表的差异更为重要。
这为我们提供了一个独特的特征工程机会。我们可以不使用原始的RGB颜色值,而是研究数据集对特定颜色空间的适应度是否有助于并改进我们最终结果指标。
为了研究这个主题,我们使用MedMNIST的增强血细胞数据集(见原论文)。这个数据集包含了大约17000张来自10种不同血细胞类型的图像。让我们来看看这个数据集中的一些图片!
# Download dataset!wget https://zenodo.org/record/5208230/files/bloodmnist.npz# Load packagesimport numpy as npfrom glob import globimport matplotlib.pyplot as pltfrom tqdm.notebook import tqdmimport pandas as pdimport seaborn as snssns.set_context("talk")%config InlineBackend.figure_format = 'retina'# Load data setdata = np.load("bloodmnist.npz")X_tr = data["train_images"].astype("float32") / 255X_va = data["val_images"].astype("float32") / 255X_te = data["test_images"].astype("float32") / 255y_tr = data["train_labels"]y_va = data["val_labels"]y_te = data["test_labels"]labels = ["basophils", "eosinophils", "erythroblasts", "granulocytes_immature", "lymphocytes", "monocytes", "neutrophils", "platelets"]labels_tr = np.array([labels[j] for j in y_tr.ravel()])labels_va = np.array([labels[j] for j in y_va.ravel()])labels_te = np.array([labels[j] for j in y_te.ravel()])图像取自原始论文,并描述符合数据集的十种血细胞类型。
def plot_dataset(X): """Helper function to visualize first few images of a dataset.""" fig, axes = plt.subplots(12, 12, figsize=(15.5, 16)) for i, ax in enumerate(axes.flatten()): if X.shape[-1] == 1: ax.imshow(np.squeeze(X[i]), cmap="gray") else: ax.imshow(X[i]) ax.axis("off") ax.set_aspect("equal") plt.subplots_adjust(wspace=0, hspace=0) plt.show()# Plot datasetplot_dataset(X_tr)我们可以看到以下内容:背景颜色以及主要目标对象颜色在大多数情况下是相同的(但并非总是如此)!为了更好地理解为什么这能够为我们提供了颜色值特征工程的机会,让我们先看看这些图像占据的 RGB 颜色空间。
# Extract a few RGB color valuesX_colors = X_tr.reshape(-1, 3)[::100]# Plot color values in 3D spacefig = plt.figure(figsize=(16, 5))# Loop through 3 different viewsfor i, view in enumerate([[-45, 10], [40, 80], [60, 10]]): ax = fig.add_subplot(1, 3, i + 1, projection="3d") ax.scatter(X_colors[:, 0], X_colors[:, 1], X_colors[:, 2], facecolors=X_colors, s=2) ax.set_xlabel("R") ax.set_ylabel("G") ax.set_zlabel("B") ax.xaxis.set_ticklabels([]) ax.yaxis.set_ticklabels([]) ax.zaxis.set_ticklabels([]) ax.view_init(azim=view[0], elev=view[1], vertical_axis="z") ax.set_xlim(0, 1) ax.set_ylim(0, 1) ax.set_zlim(0, 1)plt.suptitle("Colors in RGB space", fontsize=20)plt.show()这是原始数据集相同 RGB 颜色空间上的三个不同视图。这个数据集只覆盖了整个立方体的一小部分,即所有 16'777'216 个可能的颜色值。这为我们现在提供了三个独特的机会:
我们可以通过将 RGB 颜色转换为灰度图像来降低图像复杂。我们可以重新对齐和拉伸颜色值,以便 RGB 值更好地填充 RGB 颜色空间。我们可以重新调整颜色值的方向,使三个立方体轴延伸到最大方差的方向。这最好通过 PCA 方法完成。其实还有多种其他方式来操作颜色值,但对于本文我们将使用上面提到的三种方式。
数据集扩充1.灰度变换
首先,让我们将 RGB 图像转换为灰度图像(即从 3D 到 1D 数据集)。灰度图像不仅仅是对 RGB 进行简单的平均,而是对其进行轻微不平衡的加权。本文使用使用 scikit-image 的 rgb2gray 来执行这个转换。此外我们将拉伸灰度值以完全覆盖图像的 0 到 255 值范围。
# Install scikit-image if not already done!pip install -U scikit-imagefrom skimage.color import rgb2gray# Create grayscale imagesX_tr_gray = rgb2gray(X_tr)[..., None]X_va_gray = rgb2gray(X_va)[..., None]X_te_gray = rgb2gray(X_te)[..., None]# Stretch color range to training min, maxgmin_tr = X_tr_gray.min()X_tr_gray -= gmin_trX_va_gray -= gmin_trX_te_gray -= gmin_trgmax_tr = X_tr_gray.max()X_tr_gray /= gmax_trX_va_gray /= gmax_trX_te_gray /= gmax_trX_va_gray = np.clip(X_va_gray, 0, 1)X_te_gray = np.clip(X_te_gray, 0, 1)让我们看看这些灰度颜色值是如何在之前的 RGB 颜色空间中定位的。# Put 1D values into 3D spaceX_tr_show = np.concatenate([X_tr_gray, X_tr_gray, X_tr_gray], axis=-1)# Extract a few grayscale color valuesX_grays = X_tr_show.reshape(-1, 3)[::100]# Plot color values in 3D spacefig = plt.figure(figsize=(16, 5))# Loop through 3 different viewsfor i, view in enumerate([[-45, 10], [40, 80], [60, 10]]): ax = fig.add_subplot(1, 3, i + 1, projection="3d") ax.scatter(X_grays[:, 0], X_grays[:, 1], X_grays[:, 2], facecolors=X_grays, s=2) ax.set_xlabel("R") ax.set_ylabel("G") ax.set_zlabel("B") ax.xaxis.set_ticklabels([]) ax.yaxis.set_ticklabels([]) ax.zaxis.set_ticklabels([]) ax.view_init(azim=view[0], elev=view[1], vertical_axis="z") ax.set_xlim(0, 1) ax.set_ylim(0, 1) ax.set_zlim(0, 1)plt.suptitle("Colors in Grayscale space", fontsize=20)plt.show()灰度颜色值正好位于立方体对角线上。我们将三维数据集减少到一维,现在看看单元格图像在灰度格式下的样子。
# Plot datasetplot_dataset(X_tr_gray)2.颜色调整和拉伸
在第一个 RGB 立方体图中,我们看到该数据集的颜色值仅占整个立方体的一部分。当将该点云与第二个 RGB 立方图中的黑白对角线进行比较时,我们可以看到原始颜色偏离轴并略微弯曲。
为了更好地说明我们的意思,这里尝试找到支持该点云的等距“云质心”(或质心)。
# Get RGB color valuesX_colors = X_tr.reshape(-1, 3)# Get distance of all color values to black (0,0,0)dist_origin = np.linalg.norm(X_colors, axis=-1)# Find index of 0.1% smallest entryperc_sorted = np.argsort(np.abs(dist_origin - np.percentile(dist_origin, 0.1)))# Find centroid of lowest 0.1% RGBscentroid_low = np.mean(X_colors[perc_sorted][: len(X_colors) // 1000], axis=0)# Order all RGB values with regards to distance to low centroidorder_idx = np.argsort(np.linalg.norm(X_colors - centroid_low, axis=-1))# According to this order, divide all RGB values into N equal sized chunksnth = 256splits = np.array_split(np.arange(len(order_idx)), nth, axis=0)# Compute centroids, i.e. RGB mean values of each segmentcentroids = np.array([np.median(X_colors[order_idx][s], axis=0) for s in tqdm(splits)])# Only keep centroids that are spaced enoughnew_centers = [centroids[0]]for i in range(len(centroids)): if np.linalg.norm(new_centers[-1] - centroids[i]) 0.03: new_centers.append(centroids[i])new_centers = np.array(new_centers)上一篇:小盘谷 小盘股
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |