rgb_hsv_display / app.py
KJMAN678's picture
first commit
f4c3694
import numpy as np
import streamlit as st
import cv2
import pandas as pd
# HSV H(色相)の変更
def changedH(bgr_img, shift):
hsvimage = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2HSV_FULL) # BGR->HSV
hi = hsvimage[:,:,0].astype(np.int32)
if shift < 0:
nhi = hi.flatten()
for px in nhi:
if px < 0:
px = 255 - px
nhi = nhi.reshape(hsvimage.shape[:2])
hi = nhi.astype(np.uint8)
chimg = (hi + shift) % 255
hsvimage[:,:,0] = chimg
hsv8 = hsvimage.astype(np.uint8)
return cv2.cvtColor(hsv8,cv2.COLOR_HSV2BGR_FULL) # HSV->BGR
# HSV S(彩度),V(明度)の変更
def changedSV(bgr_img, alpha, beta, color_idx):
hsvimage = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2HSV_FULL) # BGR->HSV
hsvf = hsvimage.astype(np.float32)
hsvf[:,:,color_idx] = np.clip(hsvf[:,:,1] * alpha+beta, 0, 255)
hsv8 = hsvf.astype(np.uint8)
return cv2.cvtColor(hsv8,cv2.COLOR_HSV2BGR_FULL)
# HSV S(彩度)の変更
def changedS(bgr_img, alpha, beta):
return changedSV(bgr_img, alpha, beta, 1)
# HSV V(明度)の変更
def changedV(bgr_img, alpha, beta):
return changedSV(bgr_img, alpha, beta, 2)
def main():
st.subheader("RGB値")
R = st.slider(label='Red',
min_value=0,
max_value=255,
value=100,
)
st.write(f'{R}')
G = st.slider(label='Green',
min_value=0,
max_value=255,
value=100,
)
st.write(f'{G}')
B = st.slider(label='Blue',
min_value=0,
max_value=255,
value=100,
)
st.write(f'{B}')
R_nmp = np.array([R] * 80 * 200).reshape(80, 200).astype(np.uint8)
G_nmp = np.array([G] * 80 * 200).reshape(80, 200).astype(np.uint8)
B_nmp = np.array([B] * 80 * 200).reshape(80, 200).astype(np.uint8)
img_nmp = np.stack([R_nmp, G_nmp, B_nmp], 2)
st.image(
img_nmp,
width=640,
caption=f"R:{R} G:{G} B:{B}"
)
# HSV変換
img_hsv = cv2.cvtColor(img_nmp, cv2.COLOR_RGB2HSV)
# HSV値を取得
H = img_hsv.T[0].flatten().min()
S = img_hsv.T[1].flatten().min()
V = img_hsv.T[2].flatten().min()
# 表示
st.subheader("HSV値")
st.info(f"H:{H} S:{S} V:{V}")
# RGBのサンプル
df = pd.DataFrame(
[
["白", 255, 255, 255],
["黄色", 255, 255, 0],
["薄い灰色", 192, 192, 192],
["水色", 0, 255, 255],
["黄緑", 0, 255, 0],
["灰色", 128, 128, 128],
["黄土色", 128, 128, 0],
["濃い桃色", 255, 0, 255],
["青緑", 0, 128, 128],
["赤", 255, 0, 0],
["緑", 0, 128, 0],
["紫", 128, 0, 128],
["茶色", 128, 0, 0],
["青", 0, 0, 255],
["紺", 0, 0, 128],
["黒", 0, 0, 0],
],
columns = ["色", "R", "G", "B"]
)
st.sidebar.subheader("RGBサンプル")
st.sidebar.table(df.set_index("色"))
st.sidebar.markdown('日立HP[JP1/Automatic Job Management System 3 操作ガイド 11.11 RGB値による色の指定](http://itdoc.hitachi.co.jp/manuals/3020/30203S0933/AJSV0206.HTM) より引用')
if __name__ == '__main__':
main()