Himawari画像から表層流速を推定する:MCC/PIVとOptical Flow
2時刻の衛星画像に写るSSTやクロロフィルa濃度の空間パターンが、次の画像でどこへ移動したかを探します。疑似データでMCC/PIVの原理を理解し、Himawari SST・CHLA画像へ適用し、最後にSST-PIVとCHLA-PIVを比較します。
この演習の中心的な問い
このページの構成
________ を自分で埋めて実行します。run06eは完全スクリプトです。各スクリプトは、上から順に「設定」「入力」「PIV計算」「QC」「図化」「保存」「関数群」という構造になっています。このページでは、その全ブロックで何をしているのかを説明します。0. 配布ファイル
この演習では、MATLABスクリプトとHimawariのSST・CHLAデータを同じ作業フォルダに置いて実行します。Web配布では、画像・コード・データを orsprac06_assets/ にまとめます。
完全版。run06c/dの出力を読み込んで比較します。
| 必要なHimawari MATファイル | 用途 |
|---|---|
HIMAWARI_SST_Hokkaido_20260601_0100_subset.mat | run06cの1時刻目SST |
HIMAWARI_SST_Hokkaido_20260601_0200_subset.mat | run06cの2時刻目SST |
HIMAWARI_CHLA_Hokkaido_20260601_0100_subset.mat | run06dの1時刻目CHLA |
HIMAWARI_CHLA_Hokkaido_20260601_0200_subset.mat | run06dの2時刻目CHLA |
orsprac06_assets/data/... に変更して実行してください。1. MCC/PIVの原理:最大相互相関を探す
MCC/PIVの基本は、画像1の小窓に写る模様が、画像2のどこへ移動したかを探すことです。ここでいう「模様」は、SSTやCHLAの絶対値そのものではなく、小窓内の濃淡パターンです。相関が最大になる移動量 dx, dy を、その場所の見かけ変位とみなします。

1.1 小窓、探索範囲、相関マップ
- 画像1の中心点を決める。 その周囲に
WINDOW_SIZE × WINDOW_SIZEの小窓を置きます。 - 画像2で候補位置を動かす。
dx=-MAX_SHIFT:MAX_SHIFT,dy=-MAX_SHIFT:MAX_SHIFTの範囲をすべて試します。 - 各候補位置で相関を計算する。 相関値を並べると、小さな相関マップになります。
- 最大相関ピークを探す。 その位置が整数pixelの推定変位です。
- ピーク周辺からサブピクセル補正を行う。 3点放物線近似により、整数pixelより細かい変位を求めます。
% Image 1 small window
A = I1(r1:r2, c1:c2);
% Candidate window in Image 2
B = I2(r1+dy:r2+dy, c1+dx:c2+dx);
% Normalized cross correlation in the window
m = isfinite(A) & isfinite(B);
a = A(m);
b = B(m);
a = a - mean(a);
b = b - mean(b);
cc = sum(a .* b) / sqrt(sum(a.^2) * sum(b.^2));1.2 なぜ小窓内で平均を引くのか
この演習では、画像全体から広域場を引くhigh-pass処理は主処理として使いません。代わりに、相関計算の各小窓内で平均を引きます。これは、SSTやCHLAの絶対値が少し変わっても、小窓内の濃淡パターンが一致していれば相関が高くなるようにするためです。
1.3 相関ピークは一意とは限らない
最大相関が1点に鋭く立つとは限りません。直線的なフロント、周期的な模様、雲縁、テクスチャの弱い場所では、複数の候補で相関が高くなることがあります。そのため、rmax だけでなく peak_gap を使います。
% bestR : highest correlation peak
% secondR: highest independent second peak
peak_gap = bestR - secondR;
basic_qc = P.rmax >= MIN_CORRELATION & ...
P.peak_gap >= MIN_PEAK_GAP & ...
P.valid_fraction >= MIN_VALID_FRACTION;| 量 | 意味 | 小さい/大きいとどう解釈するか |
|---|---|---|
rmax | 最大相関係数 | 低いと模様が一致していない。高くても一意性は保証されません。 |
peak_gap | 最大ピークと独立した第2ピークとの差 | 小さいと移動先が曖昧。大きいとピークが比較的一意です。 |
valid_fraction | 相関窓内で有効な画素の割合 | 小さいと雲・陸・欠測が多く、相関が不安定です。 |
texture | 窓内パターンの標準偏差 | 小さいと模様が弱く、どこへ移動したか決まりにくいです。 |
edge_flag | 最大ピークが探索範囲の端にあるか | 端にある場合、本当のピークが探索範囲外にある可能性があります。 |
neighbor_qc | 周囲ベクトルとの整合性 | 孤立して向きや大きさが違うベクトルを落とします。 |
2. run06a:雲なし疑似データでMCC/PIVを理解する
run06aは、実データに入る前の基礎編です。人工的なトレーサー画像を作り、あらかじめ決めた変位場で動かし、その移動をMCC/PIVで推定します。真値があるので、推定結果の良し悪しを直接確認できます。
run06aの全ブロック解説
最初の画像 field1 を作ります。乱数ノイズだけではPIVが難しいため、複数のガウス状パッチ、背景勾配、波状の濃淡を重ねます。ここで作るのは海洋そのものではなく、SSTやCHLAに似た「追跡できる模様」を持つ教材用画像です。
xg, yg:格子座標。field1:時刻1の疑似トレーサー画像。robust_normalize:外れ値の影響を抑え、相関計算に使いやすくする関数。
真値の変位場 uTrue, vTrue を作ります。ここでは単純な一様移動ではなく、渦のような回転成分と弱い背景流を含めます。学生が「真値」と「推定値」を比べられるようにするための重要ブロックです。
uTrue:x方向の真の変位。pixel単位です。vTrue:y方向の真の変位。pixel単位です。- この段階では物理単位 m/s ではなく、画像格子上の移動量として扱います。
field1 を真値変位場で移動させ、時刻2の画像 field2 を作ります。ここでは「時刻2の各格子点に来た水塊は、時刻1ではどこにいたか」を補間で求めるため、interp2 を使います。
field1 と field2 の間の見かけ変位です。ここでは真値を知っているので、推定の正しさを評価できます。入力画像と真値ベクトルを図にします。ここで、模様がどの方向へ流されているかを目で確認します。PIVの前に、画像に追跡可能な構造があるかを確認するためのブロックです。
PIVのパラメータを設定します。ここでの設定が結果の見た目と信頼性を大きく変えます。
| パラメータ | 意味 |
|---|---|
win | 相関を取る小窓の大きさ。大きいほど安定、小さいほど細かい構造に敏感。 |
step | ベクトルを計算する間隔。小さいほどベクトル密度が上がります。 |
maxShift | 探索する最大変位。真値より小さいと正しく推定できません。 |
minValidFraction | 雲なしではほぼ1に近くできます。run06b以降で重要になります。 |
minCorrelation, minPeakGap, minTextureStd | 相関の高さ、一意性、模様の強さに関するQC閾値です。 |
このブロックがPIVの本体です。robust_normalize で画像を標準化し、mcc_piv_core で各窓の最大相互相関を探します。その後、basic QCとneighbor QCを順にかけます。
I1 = robust_normalize(field1, 3.0);
I2 = robust_normalize(field2, 3.0);
P = mcc_piv_core(I1, I2, win, step, maxShift, ...
minValidFraction, peakExcludeRadius);
basic_qc = raw_mask & ...
P.valid_fraction >= minValidFraction & ...
P.rmax >= minCorrelation & ...
P.peak_gap >= minPeakGap & ...
P.texture >= minTextureStd & ...
~P.edge_flag;
neighbor_qc = neighbor_consistency_qc(P.dx, P.dy, basic_qc, maxNeighborDiff);
final_qc = basic_qc & neighbor_qc;basic_qc は各ベクトル単体の品質、neighbor_qc は周囲との整合性です。どちらか一方だけでは不十分です。
真値ベクトルと推定ベクトルを並べます。ここでは「推定できている場所」と「推定が怪しい場所」を目で確認します。真値があるrun06aでしかできない重要な診断です。
dx, dy, rmax, peak_gap などを地図状に表示します。ベクトル図だけでは、なぜ落ちたのか・なぜ残ったのかが分かりにくいため、QC診断図を必ず確認します。
結果をMATファイルに保存します。後から比較・図の再作成・誤差計算をするため、推定ベクトルだけでなく、真値、QCマスク、相関診断量も保存します。
スクリプト末尾には、計算を支えるローカル関数があります。授業では中身を全部書く必要はありませんが、役割は理解します。
| 関数 | 役割 |
|---|---|
mcc_piv_core | 小窓を走査し、相関最大の変位を求めるPIV本体。 |
window_corr | NaNを除き、小窓内平均を引いて正規化相互相関を計算。 |
second_peak_excluding_radius | 最大ピークの肩を除外し、独立した第2ピークを探す。 |
parabola_subpixel | 相関ピークの周辺3点からサブピクセル補正。 |
neighbor_consistency_qc | 周囲ベクトルの中央値と大きく違う孤立ベクトルを落とす。 |



dx, dy, 相関係数などの診断図。ベクトルが合っているかを成分ごとに確認できます。3. run06b:雲あり疑似データと cloudBufferPix
run06bは、run06aに雲・欠測を加えた版です。MCC/PIVは窓内に十分な有効画素があれば相関を計算できてしまうため、中心点が雲上にあるベクトルや、推定された移動先が雲上にあるベクトルを明示的に落とす必要があります。
run06bの全ブロック解説
run06aと同じです。雲を入れる前の「本当なら追跡できる画像」を作ります。ここをrun06aと同じ構造にすることで、雲の影響だけを比較できます。
人工的な雲マスク cloudMask1, cloudMask2 を作り、雲の場所をNaNにします。雲は「値が見えない領域」です。PIVではNaNを相関計算から除外しますが、それだけでは雲縁や中心点の問題が残ります。
cloudMask1:画像1の雲。cloudMask2:画像2の雲。field1_cloudy,field2_cloudy:雲部分をNaNにした画像。
雲なし画像と雲あり画像を比較します。雲によって相関窓がどの程度欠けるかを視覚的に確認します。
run06aの設定に加えて、雲QC用の cloudBufferPix を設定します。
cloudBufferPix の意味cloudBufferPix = 2 は、雲本体に加えて、その周囲2 pixelも危険域として扱うという意味です。3や4にすると安全側になりますが、良いベクトルまで消えてしまうことがあります。この演習では、雲縁の危険性を見せつつ、推定可能領域を残すために2を使います。
雲あり画像をrobust normalizeしてMCC/PIVを実行します。相関計算では isfinite(A) & isfinite(B) により、NaN画素を除外します。しかし、窓の一部が雲で欠けていても相関は出るため、追加でcloud QCを行います。
cloudMask1_buffer = buffer_logical_mask(cloudMask1, cloudBufferPix);
cloudMask2_buffer = buffer_logical_mask(cloudMask2, cloudBufferPix);
origin_clear = sample_logical_mask(~cloudMask1_buffer, P.ix, P.iy);
target_clear = sample_logical_mask(~cloudMask2_buffer, P.ix + P.dx, P.iy + P.dy);
cloud_qc = raw_mask & origin_clear & target_clear;origin_clear はベクトル始点、target_clear は推定された移動先を調べます。これにより、中心点が雲上なのに窓の周辺だけで相関が出てしまう問題を防ぎます。
QC前のベクトルをあえて表示します。雲や雲縁の上にもベクトルが出てしまうことを確認するためです。この図は「なぜQCが必要か」を理解するために重要です。
valid_fraction, rmax, peak_gap, cloud_qc, basic_qc, neighbor_qc, final_qc を段階的に表示します。どのQCでどのベクトルが落ちたかを確認します。
最終QC後のベクトルを表示します。雲ありでは推定可能領域が減りますが、雲のない場所ではPIVが成立することを確認します。雲縁に少し残るベクトルは、実データでも起こり得る注意点です。
最終QC後の dx, dy, 誤差、相関を表示します。雲あり条件で、残ったベクトルがどの程度真値に合っているかを確認します。
雲マスク、cloud QC、最終QC、真値、推定値を保存します。保存しておくことで、雲バッファや閾値を変えたときの比較ができます。
| 関数 | 役割 |
|---|---|
buffer_logical_mask | 雲マスクを指定pixelだけ膨張させ、雲縁の危険域を作る。 |
sample_logical_mask | 浮動小数点の始点・終点位置で、雲マスク上かどうかを最近傍で調べる。 |
mcc_piv_core, window_corr | run06aと同じPIV本体。NaNを除外して相関を計算します。 |
neighbor_consistency_qc | 孤立した変なベクトルを落とす。 |



Cloud-origin/target QC により、雲上・雲縁付近のベクトルを落とします。

4. run06c:Himawari SST画像への適用
run06cでは、疑似データではなくHimawariのSST画像2時刻を使います。ここからは真値がありません。したがって、相関診断、QC、物理的に妥当な速度範囲、SSTパターンとの対応を見て判断します。
run06cの全ブロック解説
入力ファイル、出力フォルダ、PIVモード、ROIを設定します。ここを変えるだけで、広域・fine・ROI集中解析を切り替えられます。
| 設定 | 意味 |
|---|---|
PIV_MODE = 'standard' | 広域で安定なベクトルを優先。窓は大きめ。 |
PIV_MODE = 'fine' | 沿岸・小渦を拾いやすくする標準設定。本演習の基本。 |
PIV_MODE = 'roi_eddy' | 148E, 38.5N付近など、ROIだけ高密度に見る設定。 |
ROI_LON, ROI_LAT | ズーム図やROI解析に使う領域。 |
SSTのMATファイル2つを読み込みます。想定される変数は lon, lat, SST です。緯度が降順になっている場合は、図化・計算しやすいように昇順へ直します。
ensure_lat_ascending:緯度配列とデータを南から北へ並べ直します。crop_domain:ROIモードでは指定範囲だけ切り出します。- SSTの非現実的な値や欠測はNaNとして扱います。
格子間隔、時間差、PIV窓、QC閾値を決めます。SSTはCHLAより滑らかなので、テクスチャ閾値は厳しすぎるとベクトルが残りません。
| 設定 | 意味 |
|---|---|
WINDOW_SIZE | 相関窓の大きさ。SSTでは大きいほど安定しますが、小渦は平均化されます。 |
STEP | PIVベクトルの間隔。 |
MAX_SHIFT | 1時間差で探索する最大pixel変位。 |
MIN_TEXTURE_STD | SSTの模様の強さ。厳しすぎると滑らかな海域のベクトルが消えます。 |
MAX_SPEED_MS | 物理的に大きすぎる見かけ速度を落とす閾値。 |
SST画像をMCC/PIV用画像 I1, I2 に変換します。ここでは画像全体から広域場を引きません。raw SSTを robust_normalize し、相関計算の各小窓内で平均を引きます。
% SST matching images: no broad high-pass subtraction
I1 = robust_normalize(SST1, 3.0);
I2 = robust_normalize(SST2, 3.0);SSTは南北勾配や水塊境界が強いため、模様が滑らかな場所では移動先が曖昧になります。そのため rmax だけでなく peak_gap と neighbor_qc を必ず確認します。
mcc_piv_core で変位 dx, dy を求め、格子間隔と時間差から U, V, speed に変換します。ここで初めて pixel変位が m/s になります。
P = mcc_piv_core(I1, I2, lon, lat, WINDOW_SIZE, STEP, MAX_SHIFT, ...
MIN_VALID_FRACTION, PEAK_EXCLUDE_RADIUS);
[P.U, P.V, P.speed] = grid_displacement_to_velocity(P.dx, P.dy, ...
P.lat, dlon, dlat, dt_seconds);
basic_qc = P.valid_fraction >= MIN_VALID_FRACTION & ...
P.rmax >= MIN_CORRELATION & ...
P.peak_gap >= MIN_PEAK_GAP & ...
P.texture >= MIN_TEXTURE_STD & ...
P.speed <= MAX_SPEED_MS & ...
~P.edge_flag & ...
isfinite(P.dx) & isfinite(P.dy);入力画像、QC前後、最終ベクトル、QC診断、ROIズームを作ります。PIVは数値だけでは信頼性を判断しにくいため、必ずQC診断図を一緒に見ます。
図、MATファイル、CSVを保存します。MATファイルには、lon_piv, lat_piv, U_piv, V_piv, speed_piv, mask_final などを保存します。run06eはこの出力を読みます。
| 関数 | 役割 |
|---|---|
build_piv_struct | run06eで読みやすい共通形式にPIV結果をまとめる。 |
write_piv_csv | 比較・表計算用にベクトルをCSV出力。 |
mcc_piv_core | 2画像間の変位推定の本体。 |
grid_displacement_to_velocity | pixel変位をm/sに変換。経度方向は緯度によって距離が変わります。 |
plot_vectors, plot_piv_field | ベクトル図と速度場を描く。 |




rmax, peak_gap, texture, basic QC, neighbor QC を確認します。
5. run06d:Himawari CHLA画像への適用
run06dはrun06cのCHLA版です。ただし、CHLAは値の範囲が広く、0や負値を含むとlog変換できないため、SSTとは前処理が少し違います。
run06dの全ブロック解説
入力CHLAファイル、出力フォルダ、PIVモード、ROIを設定します。roi_eddy では0.01°のCHLAを活かすこともできますが、通常のfine modeではSSTと比較しやすいように0.02°程度へ粗視化します。
CHLAのMATファイル2つを読み込みます。CHLAは海色アルゴリズム由来の値なので、SSTより欠測・ノイズ・沿岸影響が多くなります。緯度方向の並びをそろえ、必要ならROIを切り出します。
CHLA用のPIVパラメータを設定します。CHLAは細かいパッチやフィラメントが多く、SSTよりベクトルが出やすい一方、ノイズや大気補正の影響も拾いやすいです。
| 設定 | 意味 |
|---|---|
COARSEN_FACTOR | 0.01°CHLAを何pixel平均するか。2なら0.02°程度になります。 |
CHLA_CLIM | 図の背景表示範囲。PIV計算の閾値ではありません。 |
VECTOR_COLOR = 'r' | CHLA背景上でベクトルを見やすくするため、赤で表示します。 |
CHLAはまず正値だけを残し、log10(CHLA) に変換します。その後、必要に応じて粗視化し、robust normalizeします。SSTと同様、画像全体のhigh-passは行いません。
CHLA1_native(CHLA1_native <= 0) = NaN;
CHLA2_native(CHLA2_native <= 0) = NaN;
LCHLA1_native = log10(CHLA1_native);
LCHLA2_native = log10(CHLA2_native);
[lon, lat, LCHLA1] = block_nanmean_2d(lon0, lat0, LCHLA1_native, COARSEN_FACTOR);
[~, ~, LCHLA2] = block_nanmean_2d(lon0, lat0, LCHLA2_native, COARSEN_FACTOR);
I1 = robust_normalize(LCHLA1, 3.0);
I2 = robust_normalize(LCHLA2, 3.0);run06cと同じMCC/PIV関数を使います。SSTとCHLAで同じ思想の相関計算を使うことで、run06eで比較しやすくします。違うのは、CHLAでは log10 と粗視化を先に行う点です。
入力画像、QC前後、最終ベクトル、QC診断、ROIズームを保存します。CHLAはベクトルが多く出るので、図としては密になります。これは必ずしも全部が正しいという意味ではなく、追跡できる濃淡パターンが多いという意味です。
MATとCSVを保存します。run06eは、SSTと同じ形式の piv 構造体を読み、SST-PIVとCHLA-PIVを比較します。
run06cとほぼ同じ関数群に加え、CHLA粗視化のための block_nanmean_2d が重要です。
| 関数 | 役割 |
|---|---|
block_nanmean_2d | NaNを無視して2×2などのブロック平均を行い、CHLAを粗視化します。 |
plot_vectors | CHLA版では色と線幅を指定できるようにしてあります。 |
mcc_piv_core, window_corr | SSTと同じ相関計算。小窓内平均を引きます。 |





6. run06e:SST-PIVとCHLA-PIVの比較
run06eは完全スクリプトです。run06cとrun06dで保存したPIV結果を読み、SST-PIVとCHLA-PIVを比較します。SSTとCHLAは同じ海流場に影響されますが、トレーサーとしては異なるため、完全一致は期待しません。
run06eの全ブロック解説
run06c/dの出力MATファイル名、出力フォルダ、ROI、比較半径を設定します。run06eは穴埋めではありません。比較の考え方を読むための完全版です。
run06c_SST_PIV_vectors.mat と run06d_CHLA_PIV_vectors.mat を読みます。これらには、ベクトル位置、U/V成分、速度、QCマスクが入っています。
全域でSST-PIVを黒、CHLA-PIVを赤で重ねます。これは全体像を見る図です。CHLAの方がベクトル数が多いため、見た目だけで一致・不一致を判断するのは危険です。
148E, 38.5N付近など、注目領域だけを拡大して重ねます。広域図では見えない局所的な一致・不一致を確認します。
各SSTベクトルに対して、近傍のCHLAベクトルを探し、速度差と方向差を計算します。現行版では、SSTベクトル位置から一定距離内のCHLAベクトルを対応させる比較を行います。
% Concept:
% For each SST-PIV vector, find a nearby CHLA-PIV vector.
% Then compare:
% speed difference = CHLA speed - SST speed
% direction difference = angle between SST and CHLA vectors速度散布図、速度差ヒストグラム、方向差ヒストグラムを作ります。速度差が0付近にピークを持つなら、速度スケールは大きく破綻していません。方向差が0°側に山を持つなら、少なくとも一部では同じ移流場を反映していると考えられます。
SSTとCHLAの対応ベクトル、速度差、方向差をMATファイルやCSVに保存します。後で条件を変えて再解析するために、図だけでなく数値表も残します。
| 関数 | 役割 |
|---|---|
extract_vectors | PIV構造体から、最終QCを通ったベクトルだけを取り出す。 |
plot_vectors_struct | PIV構造体から指定色でベクトルを描く。 |
save_figure_set | 複数図をPNGとして保存。 |
CHLA speed - SST speed が0付近にピークを持つなら、速度スケールは近いと解釈できます。


7. おまけ:Optical Flowとは何か
Optical Flowは、画像中の明るさパターンが連続的にどう動いたかを、画素ごと、または高密度格子で推定する手法です。MCC/PIVが「小窓ごとに最も似ている場所」を探すのに対し、Optical Flowはより密な変位場を求めます。
7.1 Optical Flowの基本仮定
多くのOptical Flow法は、短い時間では同じ模様の明るさが保存されるという仮定を置きます。これを brightness constancy と呼びます。
時刻1で位置 (x,y) にあった模様が、時刻2で (x+u, y+v) に移動したとき、明るさがほぼ同じだと仮定します。SSTやCHLAでは、この仮定は近似です。SSTは加熱・冷却、CHLAは生物過程や大気補正の影響を受けます。
7.2 MCC/PIVとの違い
| 項目 | MCC/PIV | Optical Flow |
|---|---|---|
| 推定単位 | 小窓ごと | 画素ごと、または高密度格子 |
| 考え方 | 相関が最大になる位置を探す | 明るさ保存と平滑性から連続変位場を推定 |
| 長所 | 相関ピーク、peak gap、valid fractionなどQCが明示しやすい | 密なベクトル場が得られ、滑らかな流れを表現しやすい |
| 短所 | 窓サイズに依存し、小スケールと安定性の両立が難しい | 滑らかに見えるが、物理的に正しいとは限らない |
| 衛星海洋画像での注意 | 雲・陸・低テクスチャで相関が曖昧 | SSTの日変化、CHLAの生物過程、雲縁を流れとして誤推定しやすい |
7.3 MATLABでの例
Computer Vision Toolboxが使える環境では、opticalFlowFarneback などを用いてOptical Flowを試せます。ただし、密なベクトル場が出るからといって、MCC/PIVより正しいとは限りません。むしろ、QCと物理的な解釈が難しくなることがあります。
% Example idea only
opticFlow = opticalFlowFarneback;
flow1 = estimateFlow(opticFlow, I1_gray);
flow2 = estimateFlow(opticFlow, I2_gray);
u = flow2.Vx;
v = flow2.Vy;最後の考察課題
- MCC/PIVで、
rmaxが高いのに信頼できないベクトルが出るのはどのような場合ですか。 peak_gapは何を表し、なぜ最大相関だけでは不十分なのですか。- run06bで、
valid_fractionだけでなくcloud_qcが必要な理由を説明してください。 cloudBufferPixを2から4に増やすと何が起きますか。安全側になる一方で、どのような欠点がありますか。- SST-PIVではCHLA-PIVよりベクトル数が少なくなることがあります。その理由を、トレーサーの空間パターンの違いから説明してください。
- CHLA-PIVで得られる見かけ速度が、必ずしも海流そのものではない理由を説明してください。
- run06eの速度差・方向差ヒストグラムから、SST-PIVとCHLA-PIVの一致・不一致をどう解釈しますか。
- Optical Flowを用いる場合、MCC/PIVと比べてどのような利点と危険性がありますか。