15
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【plotlyで画像分析いろいろ】plotlyで動的な可視化をする【python,画像】

Last updated at Posted at 2020-09-22

#plotlyで画像を簡単に分析してみます

dd.gif

#環境

python==3.8
plotly==4.10.0
scikit-image==0.17.2
requests==2.24.0
Pillow==7.2.0
matplotlib==3.3.2

#よくある画像の扱い

まずpillowつかっていきます

import matplotlib.pyplot as plt
from PIL import Image
import requests
import io

url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Crab_Nebula.jpg/240px-Crab_Nebula.jpg'
img = Image.open(io.BytesIO(requests.get(url).content))

plt.figure(figsize=(5,5))
plt.subplot(111)
plt.imshow(img)

image.png

いつものmatplotによる画像表示ができました
白黒にしましょう

gray_img = img.convert('L')

plt.figure(figsize=(5,5))
plt.subplot(111)
plt.imshow(gray_img)

imageオブジェクトはconvertを使って白黒にできます

#skimageとplotlyを使った画像処理

plotlyで画像の表示をすると嬉しい所は拡大等ができることです

import plotly.express as px
from skimage import io
img_sk = io.imread('https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Crab_Nebula.jpg/240px-Crab_Nebula.jpg')
fig = px.imshow(img_sk)
fig.show()

dd.gif

pillowで読み込んだイメージも扱えます

fig = px.imshow(gray_img, color_continuous_scale='gray')
fig.show()

image.png

#画像の中で等高線をつくる

画像の輝度に対して等高線を付けることができます

Zの値に対して色を付ける等高線(Contour)plot
startからendまでの値を対象に監視します
sizeで等高線の間隔を指定
endとsizeを同じにすることで、指定の値になる部分を抽出できます
つまり輪郭抽出などに使える

import plotly.graph_objects as go
fig = px.imshow(gray_img, color_continuous_scale='gray')
fig.add_trace(go.Contour(z=gray_img, showscale=True,
                         contours=dict(start=0, end=30, size=30,coloring='lines'),line_width=1))

fig.show()

image.png

import plotly.express as px
import plotly.graph_objects as go
from skimage import data
img_camera = data.camera()
fig = px.imshow(img_camera, color_continuous_scale='gray')

fig.add_trace(go.Contour(z=img_camera, showscale=False,
                         contours=dict(start=0, end=70, size=70, coloring='lines'),
                         line_width=2))
fig.show()

image.png

#色チャネルのヒストグラムをplotlyからつくる

from plotly.subplots import make_subplots
from skimage import data

img_sk.shape

#(240, 240, 3)

plt.imshow(img_sk)


img_r = img_sk.copy()
img_r[:, :, 1] = 0
img_r[:, :, 2] = 0
plt.imshow(img_r)

img_g = img_sk.copy()
img_g[:, :, 0] = 0
img_g[:, :, 2] = 0
plt.imshow(img_g)

img_b = img_sk.copy()
img_b[:, :, 0] = 0
img_b[:, :, 1] = 0
plt.imshow(img_b)

image.png

image.png

image.png

image.png

0以外をhistに

ff=go.Figure()
ff.add_trace(go.Histogram(x=img_r.flatten()[img_r.flatten()!=0],marker_color='red',name='red'))
ff.add_trace(go.Histogram(x=img_g.flatten()[img_g.flatten()!=0],marker_color='green',name='green'))
ff.add_trace(go.Histogram(x=img_b.flatten()[img_b.flatten()!=0],marker_color='blue',name='blue'))
ff.update_layout(barmode='overlay')
ff.update_traces(opacity=0.3)
ff.update_layout(height=400)

ff.show()

image.png

拡大してみると10以下がメインのようなので10以上の分布を確認

ff=go.Figure()
ff.add_trace(go.Histogram(x=img_r.flatten()[img_r.flatten()>10],marker_color='red',name='red'))
ff.add_trace(go.Histogram(x=img_g.flatten()[img_g.flatten()>10],marker_color='green',name='green'))
ff.add_trace(go.Histogram(x=img_b.flatten()[img_b.flatten()>10],marker_color='blue',name='blue'))
ff.update_layout(barmode='overlay')
ff.update_traces(opacity=0.3)
ff.update_layout(height=400)

ff.show()

image.png

綺麗に分かれる場合だとこんな感じになる

image.png

#白黒に対しての確認は以下

from skimage.color import rgb2gray

gray_img = rgb2gray(img_sk)


ff=go.Figure()
ff.add_trace(go.Histogram(x=gray_img.flatten()[gray_img.flatten()!=0],marker_color='pink',name='gray'))
ff.update_layout(barmode='overlay')
ff.update_traces(opacity=0.8)
ff.update_layout(height=400)

ff.show()

image.png

ff=go.Figure()
ff.add_trace(go.Histogram(x=gray_img.flatten()[gray_img.flatten()>0.1],marker_color='pink',name='gray'))
ff.update_layout(barmode='overlay')
ff.update_traces(opacity=0.8)
ff.update_layout(height=400)

ff.show()

image.png

#ついでに図中に画像を表示する方法

グラフの全面にアピール

import plotly.express as px
fig = px.scatter(x=[0, 1, 2, 3, 4], y=[0, 1, 4, 9, 16])

fig.add_layout_image(
        dict(
            source="https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Crab_Nebula.jpg/240px-Crab_Nebula.jpg",
            xref="x",
            yref="y",
            x=0,
            y=16,
            sizex=4,
            sizey=15,
            sizing="stretch")
)

fig.update_xaxes(title_text="picture No")
fig.update_yaxes(title_text="view par day", hoverformat=".3f")

fig.show()

image.png

背面(below)でそっとアピール

import plotly.express as px
fig = px.scatter(x=[0, 1, 2, 3, 4], y=[0, 1, 4, 9, 16])

fig.add_layout_image(
        dict(
            source="https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Crab_Nebula.jpg/240px-Crab_Nebula.jpg",
            xref="x",
            yref="y",
            x=0,
            y=16,
            sizex=4,
            sizey=15,
            sizing="stretch",
            opacity=0.5,
            layer="below")
)

fig.update_xaxes(title_text="picture No")
fig.update_yaxes(title_text="view par day", hoverformat=".3f")

fig.show()

image.png

小さくして棒を付けたりテキストをいれたりする

import plotly.express as px
fig = px.scatter(x=[0, 1, 2, 3, 4], y=[0, 1, 4, 9, 16])

fig.add_layout_image(
        dict(
            source="https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Crab_Nebula.jpg/240px-Crab_Nebula.jpg",
            xref="x",
            yref="y",
            x=1.68,
            y=16,
            sizex=3,
            sizey=3)
)

fig.update_layout(
    annotations=[
        dict(
            x=0.5,
            y=0.8,
            xref="paper",
            yref="paper",
            showarrow=True,
            arrowhead=0,
            opacity=0.5,
            ax=190,
            ay=100,
        )#,
#        dict(x=,y=,xref="paper",yref="paper",showarrow=True,arrowhead=0,opacity=0.5,ax=,ay=,)
    ]
)

fig.update_xaxes(title_text="picture No")
fig.update_yaxes(title_text="view par day", hoverformat=".3f")

fig.show()

画像のlayout imageはplotの位置に準ずる
plotのx,y軸が画像の左上位置x,yに相当する

棒線は画像の左下を0,0
中心を0.5,0.5とする
ax,ayは棒線の長さを表しており、指定位置x,yからx軸方向とy軸方向に伸ばした棒のベクトル合成した位置に伸びる

image.png

#以上

とりあえず動かせればなんでも楽しい説

15
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?