RGB 色空間の分割 - OpenCV 分割と配列を使用する

RGB 色空間の分割 - OpenCV 分割と配列を使用する

RGBグラフィックの生成

原則として、RGB カラー画像マトリックスはピクセルの形式で格納されます。次の例では、赤、緑、青の 3 つの原色で 3 つの円を描画します。pyplot 表示画像の形式は RGB(A) であるため、色空間変換が必要であることに特に注意する必要がありますcv2.cvtColor(image,cv2.COLOR_RGB2BGRA)

参照コード

from matplotlib import pyplot as plt
import cv2
import numpy as np
# 生成一个 640*480 的 BGR 三个通道的彩色图片,底色全为0
canvas = np.zeros((480, 640, 3), dtype='uint8')
image_path='../data/diy.jpg'
# 圆半径为 90 pixel
radius = 90
# 配色为 BGR
blue = (255, 0, 0)
green = (0, 255, 0)
red = (0, 0, 255)
# 圆边厚度为 10 pixel
thickness = 10
# 画出 红绿蓝三个图片
image = cv2.circle(canvas, (320, 200), radius, red, thickness)
image = cv2.circle(canvas, (220, 300), radius, green, thickness)
image = cv2.circle(canvas, (420, 300), radius, blue, thickness)
# 因为 pyplot 显示图片的格式为 RGB(A) 所以要进行颜色空间转换
toGBR = cv2.cvtColor(image,cv2.COLOR_RGB2BGRA)
# the image in the BGR 8-bit format
cv2.imwrite(image_path,canvas)
plt.figure(figsize=(8,12))
plt.subplot(211), plt.title('BGR format')
plt.imshow(image) # image 为 BGR 8-bit 格式,而 plt 以 RGB 方式显示,所以颜色会不对
plt.subplot(212), plt.title('RGB(A) format')
plt.imshow(toGBR) # toGBR 为 RGB(A) 格式,这才是正确的配色
plt.show()

ここに画像の説明を挿入
図 1. BGR 形式と RGB(A) 形式の違いを示し、右側のグラフィックスのカラー マッチングは正しい

RGB チャンネルを分割してグレースケールで表示する

BGR チャネルに従ってカラー画像を分割します。次の例では、上記で生成された diy.jpg 画像の各チャネルに別個の画像を表示します。表示の順序から、チャネルが赤 (0)、緑 () であることがわかります。 1)、青(2)。

参照コード

from matplotlib import pyplot as plt
import cv2
#IMREAD_COLOR 会将图片以 BGR 8-bit 格式读入
img1 = cv2.imread('../data/diy.jpg',cv2.IMREAD_COLOR)
# 将图片依 BGR 分割成三个通道
channels = cv2.split(img1)
# color in BGR
titles=['Blue', 'Green', 'Red']
figure, plots = plt.subplots(ncols=3, nrows=1,figsize=(12,6))
for i, subplot in zip(range(3), plots):
    subplot.imshow(channels[i],'gray')
    subplot.set_axis_off()
    subplot.set_title(titles[i])
plt.show()

ここに画像の説明を挿入
図 2. 分割 BGR 色空間

RGB チャンネルを分割してカラー表示する

処理手順は次のとおりです。

  1. カラー画像をロードし、BGR 8 ビット形式で読み取ります (opencv)
  2. 独立したカラー チャネルを分割する (opencv)
  3. 空のイメージを作成する (np)
  4. 空白の画像に特定のチャンネルの色を与える
  5. pltの色空間に変換(opencv)
  6. plt (matplotlib) を使用して結果を表示する

参照コード

from matplotlib import pyplot as plt
import numpy as np
import cv2
#加载彩色图像
img = cv2.imread('../data/diy.jpg',cv2.IMREAD_COLOR)
# 分割独立的颜色通道
channels = cv2.split(img)
# color in BGR
titles=['Blue', 'Green', 'Red']
figure, plots = plt.subplots(ncols=3, nrows=1,figsize=(12,6))
for i, subplot in zip(range(3), plots):
    # 创建空白图片
    temp = np.zeros(img.shape, dtype='uint8')
    # 将特定通道的颜色给予空白图片
    temp[:,:,i] = channels[i] # img[:,:,i]
    # 转换成 plt 的颜色空间
    toGBR = cv2.cvtColor(temp,cv2.COLOR_RGB2BGRA)
    subplot.imshow(toGBR)
    subplot.set_title(titles[i])
    subplot.set_axis_off()
plt.show()

ここに画像の説明を挿入
図3. RGB各チャンネルをカラー表示

背景が白い画像の場合、そのような表示方法では通常、次のコードに示すように望ましい効果を達成できません。背景が白いと、単一チャネルのディスプレイ全体が単一チャネルの背景色を表示してしまうためです。 、ターゲットを強調表示するのは簡単ではありません。さらに、人間の目の赤、青、緑は混合の結果であることが多いため、赤、青、緑の色を個別に見つけたい場合は、通常、HSV 色空間を使用します。

from matplotlib import pyplot as plt
import numpy as np
import cv2
#加载彩色图像
img = cv2.imread('../data/b.png',cv2.IMREAD_COLOR)
channels = cv2.split(img)
# color in BGR
titles=['Blue', 'Green', 'Red']
figure, plots = plt.subplots(ncols=4, nrows=1,figsize=(12,4))
for i, subplot in zip(range(4), plots):
    if i < 3:
        temp = np.zeros(img.shape, dtype='uint8')
        temp[:,:,i] = channels[i] # img[:,:,i]
        toGBR = cv2.cvtColor(temp,cv2.COLOR_RGB2BGRA)
        subplot.imshow(toGBR)
        subplot.set_title(titles[i])
        subplot.set_axis_off()
    else:
        toGBR = cv2.cvtColor(img,cv2.COLOR_RGB2BGRA)
        subplot.imshow(toGBR)
        subplot.set_title('Origin')
        subplot.set_axis_off()
plt.show()

ここに画像の説明を挿入
図4. カラー表示されたRGB各チャンネル

参考文献

  • OpenCV API、https://docs.opencv.org/
  • 画像入門、https://docs.opencv.org/4.x/db/deb/tutorial_display_image.html
  • matplotlib.pyplot.subplot、https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplot.html#matplotlib.pyplot.subplot
  • matplotlib.pyplot.imshow、https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html

おすすめ

転載: blog.csdn.net/m0_50614038/article/details/129899226