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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

238閲覧

PBCからCGC変換

biggieboo

総合スコア12

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/12/26 01:51

前提

BPCSステガノグラフィについて勉強しております。その際データが埋め込まれる画像に対して、CGC変換を行うと良いとありました。そこで下記ソースでCGC変換を実行してみました。しかし参考ページ先の変換画像とは全く異なる雰囲気の画像になってしまったのでどこが間違っているのかご指摘いただきたいです。

該当のソースコード

python3:pbc_to_cgc.py

1import numpy as np 2 3from PIL import Image 4 5def pbc_to_cgc(arr): 6 """ 7 ref:http://datahide.org/BPCSj/pbc-vs-cgc-j.html 8 """ 9 cgc = arr.copy() 10 for y in range(cgc.shape[0]): 11 for x in range(1, cgc.shape[1]): 12 cgc[y,x] = np.packbits(np.logical_xor(np.unpackbits(arr[y,x-1]), np.unpackbits(arr[y,x]))) 13 # cgc[:,1:] = np.logical_xor(arr[:,1:], arr[:,:-1]) 14 return cgc 15 16path = "images/sample.jpg" 17arr = img = Image.open(path) # read img 18arr = np.array(img) # convert to numpy array 19cgc = pbc_to_cgc(arr) 20Image.fromarray(np.uint8(cgc)).show() # show image

泥臭くyxのループでpixel毎に変換してみました。各pixelを一旦バイナリにしてxorを行い、その後再びpixelに戻しています。

元画像が以下です。
元画像
出力された画像が以下です。
CGC変換後

質問

  1. 該当ソースに誤りはございますでしょうか。あればご指摘いただきたいです。
  2. そもそもカラー画像全体で一度にCGC変換を行うのではなくビットプレーンのブロック毎にCGC変換を行うべきなのでしょうか。

補足情報(バージョンなど)

Python==3.6.7
numpy==1.14.5
Pillow==5.3.0
今のところ想定している画像は24bitカラー画像です。

参考ページ

http://datahide.org/BPCSj/pbc-vs-cgc-j.html

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

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

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

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

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

ozwk

2018/12/26 02:16 編集

このコードはすべてのピクセルについて、x座標が一つとなりのピクセルとxorをとろうとしている。 であってますか?
biggieboo

2018/12/26 02:37

ozwk様 はい、そうです。
guest

回答1

0

ベストアンサー

リンク先のiをx座標と思ったのでしょうが
iは何番目のビットかを表しているので
すべてのピクセルについてこの変換は各ピクセルのみで完結します

例えばとあるピクセルのRが255だったら
最上位ビットb[i=1]が1だから変換後の最上位ビットg[i=1]も1
その次はb[2]とb[1]でxorとって変換後g[2]=0
という意味です。

投稿2018/12/26 03:08

ozwk

総合スコア13521

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

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

biggieboo

2018/12/26 03:27

ozwk様 ご回答ありがとうございました。 なるほど、ご回答と例のおかげで理解致しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問