質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

3回答

5735閲覧

バイト列からjpeg画像の復元

HideakiK.

総合スコア15

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

1クリップ

投稿2019/07/31 03:40

編集2019/08/01 12:58

2%程欠損したバイト列からjpeg画像を復元する方法。
16進数文字列(img_string)からバイト列(b)に変換し、numpyのresize関数を用いjpeg画像に復元することを試みています。
しかし、現状欠損したデータから無理やりresizeしているためか、画像全体に斜め方向に線が入るようなノイズが出ます。
欠損した文字列でも、jpegを復元できる方法はないでしょうか?
宜しくお願いいたします。

b = bytes.fromhex(img_string) img_array = np.fromstring(b,dtype ='uint8') #バイトデータ→ndarray変換 # img_array = np.reshape(img_array,(240,320))#エラーでた # img_array=np.newaxis(img_array,(-1,-1)) #エラー出た img_array=np.resize(img_array,(240,320)) #dec_img = cv2.imdecode(img_array, 0) pil_img = Image.fromarray(img_array)

情報不足で申し訳ありません。通信モジュールで画像の長距離伝送を行いたいのですが、モジュールの都合で画像を64バイトずつ分割して送信する必要がありました。
1「2%程欠損したバイト列」「欠損した文字列」 対処したいデータはどのようなデータなのでしょうか(なぜに文字列という言葉が)? 欠損してるというからには、「元の真なるデータ」と「今あるデータ」とを比較しているはずですが、それらはそれぞれ何でしょうか? また、それらのもつどんな数値(HDD等に保存されている状態でのバイト数やら、画像の縦横サイズやら)を比較しているのでしょうか?

---[元の真データ]は送信前の画像をバイト列に変換したもの、[今あるデータ]とは受信した文字列のことです。
通信途中でバイト列が欠落してしまうことがあるということです。

2「画像全体に斜め方向に線が入るようなノイズが出ます。」 これもどんな状態なのでしょうか? 「画面全体が斜めのノイズしかない(砂嵐画面のような)」か、「元の画像が確認できるが、斜めに線が何本かノイズが"入った"状態」か など。 可能であれば結果の画像を貼ってみてはいかがでしょうか?

---画像全体に斜め方向に線が入るようなノイズが出ます。→現在では誤り率の低減(0.6%)に成功し、このノイズは消えました。
しかし、↓画像のように不規則なノイズが入ります。
復元画像

データの欠落は不可避(しかもどこで欠落するかわからない)なので、不足したバイト列からきれいに復元はやはり難しいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yominet

2019/08/01 12:37

まだるっこしくて申し訳ありませんが、幾つか違和感を感じるので確認しておきたいことが 1.「2%程欠損したバイト列」「欠損した文字列」 対処したいデータはどのようなデータなのでしょうか(なぜに文字列という言葉が)? 欠損してるというからには、「元の真なるデータ」と「今あるデータ」とを比較しているはずですが、それらはそれぞれ何でしょうか? また、それらのもつどんな数値(HDD等に保存されている状態でのバイト数やら、画像の縦横サイズやら)を比較しているのでしょうか? 2.「画像全体に斜め方向に線が入るようなノイズが出ます。」 これもどんな状態なのでしょうか? 「画面全体が斜めのノイズしかない(砂嵐画面のような)」か、「元の画像が確認できるが、斜めに線が何本かノイズが"入った"状態」か など。 可能であれば結果の画像を貼ってみてはいかがでしょうか? #内容に問題があるなら、ペイントソフトなどで似せたイメージなどでも ›現状欠損したデータから無理やりresize 元のデータが「JPG」であるならば、JPGは「圧縮技術」を用いてエンコードされているためその中身は「画像データ」の状態になっていません。 例えていうなら「テキストファイルをZIPに圧縮した場合、それをバイナリエディタで開いても文章は確認できない」という状態ですのでresize等ではなんともなりません。
HideakiK.

2019/08/01 12:50

情報不足で申し訳ありません。補足させていただきます。
yominet

2019/08/02 14:11

ノイズではなく、データが抜け落ちた状態で、受け取れたデータだけで つめて並べたために斜めになってるのだと思われます。 イメージ: AAAAA BBBBB CCCCC …  ↓ AAAAA BBBBC CCCDD … 手作業で1行ずつ直していくならまだしも機械的には無理だと思います。
guest

回答3

0

「2%程欠損したバイト列」が「圧縮後のJPEGデータが2%程度欠損している状態」を意味するのであれば、残念ながら画像復元は不可能(もしくは著しく困難)です。定性的にいって、2%もデータが破損するともはや絶望的と思います。

一般に、圧縮後の画像データバイト列が欠損した場合、そのバイト列からの綺麗な画像復元は不可能です。運が良ければ、それらしく“ごまかす(Error Concealment)”技術もありますが、重要なデータ部が破損した場合はもはや1ピクセルも復元できなくなります。

投稿2019/07/31 04:44

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikadzuchi

2019/08/01 00:22

そんなこたない。
yohhoy

2019/08/01 05:27 編集

前提とするJPEGデータの出自、破損のパターン、有用な「復元」の度合いについては、用途次第で解釈が異なりそうですね。 少なくともProgressive JPEGではDC破損の影響が後続ブロックに強い影響を与えますし、ヘッダ部(量子化マトリクスやハフマンテーブル)が運悪く壊れると復旧はかなり困難です。 結局は「当たり所が悪ければ」デコードのそものが全くできなくなりますし、AC成分が多少壊れる程度であればエラー伝搬もしないためそれなりに見える絵になります。
ikadzuchi

2019/08/01 12:55

有用な復元の度合いについてはだいぶ前提が異なっている感がありますね。 プログレッシブのことは考えていませんでした。 ヘッダ部は、ハフマンテーブルの復元は最適化されていると困難ですが最適化されていなければ固定値、量子化マトリクスは適当な値でも画像が見えはしますので、それなりに見える絵にするのは最適化されていなければ容易(かつ最適化されていないJPEGはわりと一般的)と思っています。
guest

0

ベストアンサー

イメージ説明

上の画像は、質問の画像を上部40%ぐらいの連続した画像に思える部分(上の部分)と、その下の部分に分割し、下の部分を右にずらしてみたものです。
このようにすると、上の部分の下側(左から80%ほど)と下の部分の上側(右から80%ほど)がつながって見えます。

これから推測すると、
・画像データの欠損は、画素単位ではなく、"横に長い長方形に含まれる画素"単位に発生している
・欠損した部分を白い長方形で補うことにより、上下がつながった画像(部分)を作れそうに思える。

画像の分割や、分割した画像の移動は、画像エディタ(Windowsについてくるペイント等)で容易にできるので、質問の画像を手作業で連続した画像に復元してみてください。

復元の過程で、欠損する画像のサイズ(横に長い長方形のサイズ)や、欠損のしかたが判ってくると思います。

左右にずらしながら、上下がつながる位置を探すのは、上下の色の差の総和が最小になるような位置を探せば良いのですから、一方の画像を固定し、もう一方を1画素ずつずらしながら色の差の総和を計算してゆく。その中で総和が最小となる位置を見つける。という手順でできると思います。

投稿2019/08/03 09:41

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HideakiK.

2019/08/03 14:08

そのようなやり方もあるのですね。ありがとうございます!
guest

0

JPEGは2%程度の欠損ならふつうに表示するだけで(欠損部位以外)ほとんど正常に見えます。
(全データのうちバイト単位で2%がランダムに0または飛ばされていると解釈しました)
あとは欠損の前後でブロック単位でのずれや色調の変化が見られるでしょうが、見た目で分かるので適宜手動で合わせればよいでしょう。
また、重要なデータ部が破損したらむしろラッキーです。JPEGに画像データ以外はヘッダしか無いのでたぶんこれのことだと思いますが、(変に最適化していなければ)ふつうは連続した画像は同じ圧縮設定で、サイズは見た目で分かるので容易に復元できます。
JpegAnalyzer PlusというJPEG復元に特化したソフトがあるので試してみてはどうでしょう。


ちょっとまってください、画像見ましたがこれJPEGの破損の仕方じゃないですよ。
JPEGになる以前、素のビットマップデータの時点で破損しています。
斜めにノイズという点でJPEGっぽくないと気づくべきでした。違和感はあったのだが…。

投稿2019/08/01 00:32

編集2019/08/03 17:18
ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HideakiK.

2019/08/03 14:08

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問