author = {Dumitrescu, Sorina and Wu, Xiaolin},
title = {LSB steganalysis based on high-order statistics},
booktitle = {Proceedings of the 7th workshop on Multimedia and security},
- series = {MM\&\#38;Sec '05},
+ series = {MMSec '05},
year = {2005},
isbn = {1-59593-032-9},
location = {New York, NY, USA},
note = {to appear}
}
+@article{DBLP:journals/tsp/DumitrescuWW03,
+ added-at = {2012-02-06T00:00:00.000+0100},
+ author = {Dumitrescu, Sorina and Wu, Xiaolin and Wang, Zhe},
+ biburl = {http://www.bibsonomy.org/bibtex/2556caad9b61980d3458885153a52321c/dblp},
+ ee = {http://dx.doi.org/10.1109/TSP.2003.812753},
+ interhash = {f51bec0b4e4f8aba644eb0938018d2c6},
+ intrahash = {556caad9b61980d3458885153a52321c},
+ journal = {IEEE Transactions on Signal Processing},
+ keywords = {dblp},
+ number = 7,
+ pages = {1995-2007},
+ timestamp = {2012-02-06T00:00:00.000+0100},
+ title = {Detection of LSB steganography via sample pair analysis.},
+ url = {http://dblp.uni-trier.de/db/journals/tsp/tsp51.html#DumitrescuWW03},
+ volume = 51,
+ year = 2003
+}
+
+@inproceedings{DBLP:conf/mmsec/FridrichGD01,
+ added-at = {2007-10-26T00:00:00.000+0200},
+ author = {Fridrich, Jessica J. and Goljan, Miroslav and Du, Rui},
+ biburl = {http://www.bibsonomy.org/bibtex/21c12d6fb5f949f98fabe4ee75cab4f8b/dblp},
+ booktitle = {MMSec},
+ crossref = {DBLP:conf/mmsec/2001},
+ date = {2007-10-26},
+ description = {dblp},
+ editor = {Georganas, Nicolas D. and Popescu-Zeletin, Radu},
+ ee = {http://doi.acm.org/10.1145/1232454.1232466},
+ interhash = {de49b3b9958119616eee66f14060f47f},
+ intrahash = {1c12d6fb5f949f98fabe4ee75cab4f8b},
+ isbn = {1-58113-393-6},
+ keywords = {dblp},
+ pages = {27-30},
+ publisher = {ACM},
+ timestamp = {2007-10-26T00:00:00.000+0200},
+ title = {Reliable detection of LSB steganography in color and grayscale images.},
+ url = {http://dblp.uni-trier.de/db/conf/mmsec/mmsec2001.html#FridrichGD01},
+ year = 2001
+}
+
+
+@proceedings{DBLP:conf/mmsec/2001,
+ editor = {Nicolas D. Georganas and
+ Radu Popescu-Zeletin},
+ title = {Proceedings of the 4th workshop on Multimedia {\&} Security:
+ New Challenges, MM{\&}Sec 2001, Ottawa, Ontario, Canada,
+ October 5, 2001},
+ booktitle = {MM{\&}Sec},
+ publisher = {ACM},
+ year = {2001},
+ isbn = {1-58113-393-6},
+ bibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+@inproceedings{DBLP:conf/ih/PevnyFB10,
+ added-at = {2010-10-08T00:00:00.000+0200},
+ author = {Pevný, Tomás and Filler, Tomás and Bas, Patrick},
+ biburl = {http://www.bibsonomy.org/bibtex/28d83b7eac2c22ed5e7e072fd43a34248/dblp},
+ booktitle = {Information Hiding},
+ crossref = {DBLP:conf/ih/2010},
+ editor = {Böhme, Rainer and Fong, Philip W. L. and Safavi-Naini, Reihaneh},
+ ee = {http://dx.doi.org/10.1007/978-3-642-16435-4_13},
+ interhash = {b30869c1bb39a2c15b33e05e5139e58b},
+ intrahash = {8d83b7eac2c22ed5e7e072fd43a34248},
+ isbn = {978-3-642-16434-7},
+ keywords = {dblp},
+ pages = {161-177},
+ publisher = {Springer},
+ series = {Lecture Notes in Computer Science},
+ timestamp = {2010-10-08T00:00:00.000+0200},
+ title = {Using High-Dimensional Image Models to Perform Highly Undetectable Steganography.},
+ url = {http://dblp.uni-trier.de/db/conf/ih/ih2010.html#PevnyFB10},
+ volume = 6387,
+ year = 2010
+}
+
+@proceedings{DBLP:conf/ih/2010,
+ editor = {Rainer B{\"o}hme and
+ Philip W. L. Fong and
+ Reihaneh Safavi-Naini},
+ title = {Information Hiding - 12th International Conference, IH 2010,
+ Calgary, AB, Canada, June 28-30, 2010, Revised Selected
+ Papers},
+ booktitle = {Information Hiding},
+ publisher = {Springer},
+ series = {Lecture Notes in Computer Science},
+ volume = {6387},
+ year = {2010},
+ isbn = {978-3-642-16434-7},
+ ee = {http://dx.doi.org/10.1007/978-3-642-16435-4},
+ bibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+
+@article{DBLP:journals/eswa/ChenCL10,
+ added-at = {2010-07-21T15:44:10.000+0200},
+ author = {Chen, Wen-Jan and Chang, Chin-Chen and Le, T. Hoang Ngan},
+ biburl = {http://www.bibsonomy.org/bibtex/228889a4ab329da28559f0910469f054b/dblp},
+ date = {2010-05-03},
+ ee = {http://dx.doi.org/10.1016/j.eswa.2009.09.050},
+ interhash = {bc34a5f04661fee24ee62c39e76361be},
+ intrahash = {28889a4ab329da28559f0910469f054b},
+ journal = {Expert Syst. Appl.},
+ keywords = {dblp},
+ number = 4,
+ pages = {3292-3301},
+ timestamp = {2010-07-21T15:44:10.000+0200},
+ title = {High payload steganography mechanism using hybrid edge detector.},
+ url = {http://dblp.uni-trier.de/db/journals/eswa/eswa37.html#ChenCL10},
+ volume = 37,
+ year = 2010
+}
+
+@article{DBLP:journals/tifs/FillerJF11,
+ added-at = {2011-09-29T00:00:00.000+0200},
+ author = {Filler, Tomás and Judas, Jan and Fridrich, Jessica J.},
+ biburl = {http://www.bibsonomy.org/bibtex/250e43c05a74eec17524b3df8db442da5/dblp},
+ ee = {http://dx.doi.org/10.1109/TIFS.2011.2134094},
+ interhash = {b27d23ed0c9936d568e16c51378abccd},
+ intrahash = {50e43c05a74eec17524b3df8db442da5},
+ journal = {IEEE Transactions on Information Forensics and Security},
+ keywords = {dblp},
+ number = {3-2},
+ pages = {920-935},
+ timestamp = {2011-09-29T00:00:00.000+0200},
+ title = {Minimizing Additive Distortion in Steganography Using Syndrome-Trellis Codes.},
+ url = {http://dblp.uni-trier.de/db/journals/tifs/tifs6.html#FillerJF11},
+ volume = 6,
+ year = 2011
+}
+
+
+
+@inproceedings{DBLP:conf/ih/Westfeld01,
+ added-at = {2011-06-28T00:00:00.000+0200},
+ author = {Westfeld, Andreas},
+ biburl = {http://www.bibsonomy.org/bibtex/2fea2c6aabf7eba19ceaec93f913e5d8d/dblp},
+ booktitle = {Information Hiding},
+ crossref = {DBLP:conf/ih/2001},
+ editor = {Moskowitz, Ira S.},
+ ee = {http://dx.doi.org/10.1007/3-540-45496-9_21},
+ interhash = {e7eaa917e995dc9373f10304d3e79255},
+ intrahash = {fea2c6aabf7eba19ceaec93f913e5d8d},
+ isbn = {3-540-42733-3},
+ keywords = {dblp},
+ pages = {289-302},
+ publisher = {Springer},
+ series = {Lecture Notes in Computer Science},
+ timestamp = {2011-06-28T00:00:00.000+0200},
+ title = {F5-A Steganographic Algorithm.},
+ url = {http://dblp.uni-trier.de/db/conf/ih/ihw2001.html#Westfeld01},
+ volume = 2137,
+ year = 2001
+}
+
+@proceedings{DBLP:conf/ih/2001,
+ editor = {Ira S. Moskowitz},
+ title = {Information Hiding, 4th International Workshop, IHW 2001,
+ Pittsburgh, PA, USA, April 25-27, 2001, Proceedings},
+ booktitle = {Information Hiding},
+ publisher = {Springer},
+ series = {Lecture Notes in Computer Science},
+ volume = {2137},
+ year = {2001},
+ isbn = {3-540-42733-3},
+ bibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+@inproceedings{DBLP:conf/ih/KimDR06,
+ added-at = {2007-09-20T00:00:00.000+0200},
+ author = {Kim, Younhee and Duric, Zoran and Richards, Dana},
+ biburl = {http://www.bibsonomy.org/bibtex/2f0324f70d62d9dfba568e393920aaa16/dblp},
+ booktitle = {Information Hiding},
+ crossref = {DBLP:conf/ih/2006},
+ date = {2007-09-20},
+ description = {dblp},
+ editor = {Camenisch, Jan and Collberg, Christian S. and Johnson, Neil F. and Sallee, Phil},
+ ee = {http://dx.doi.org/10.1007/978-3-540-74124-4_21},
+ interhash = {399aab122b39cfd6f6e951a1b276c786},
+ intrahash = {f0324f70d62d9dfba568e393920aaa16},
+ isbn = {978-3-540-74123-7},
+ keywords = {dblp},
+ pages = {314-327},
+ publisher = {Springer},
+ series = {Lecture Notes in Computer Science},
+ timestamp = {2007-09-20T00:00:00.000+0200},
+ title = {Modified Matrix Encoding Technique for Minimal Distortion Steganography.},
+ url = {http://dblp.uni-trier.de/db/conf/ih/ih2006.html#KimDR06},
+ volume = 4437,
+ year = 2006
+}
+
+
+@proceedings{DBLP:conf/ih/2006,
+ editor = {Jan Camenisch and
+ Christian S. Collberg and
+ Neil F. Johnson and
+ Phil Sallee},
+ title = {Information Hiding, 8th International Workshop, IH 2006,
+ Alexandria, VA, USA, July 10-12, 2006. Revised Selcted Papers},
+ booktitle = {Information Hiding},
+ publisher = {Springer},
+ series = {Lecture Notes in Computer Science},
+ volume = {4437},
+ year = {2007},
+ isbn = {978-3-540-74123-7},
+ bibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+@inproceedings{DBLP:conf/mmsec/FridrichPK07,
+ added-at = {2007-10-26T00:00:00.000+0200},
+ author = {Fridrich, Jessica J. and Pevný, Tomás and Kodovský, Jan},
+ biburl = {http://www.bibsonomy.org/bibtex/26123ac512b5e1fe72a44e73d101d8b95/dblp},
+ booktitle = {MMSec},
+ crossref = {DBLP:conf/mmsec/2007},
+ date = {2007-10-26},
+ description = {dblp},
+ editor = {Kundur, Deepa and Prabhakaran, Balakrishnan and Dittmann, Jana and Fridrich, Jessica J.},
+ ee = {http://doi.acm.org/10.1145/1288869.1288872},
+ interhash = {35c4a20b41b7861bcb09c9ff335ac601},
+ intrahash = {6123ac512b5e1fe72a44e73d101d8b95},
+ isbn = {978-1-59593-857-2},
+ keywords = {dblp},
+ pages = {3-14},
+ publisher = {ACM},
+ timestamp = {2007-10-26T00:00:00.000+0200},
+ title = {Statistically undetectable jpeg steganography: dead ends challenges, and opportunities.},
+ url = {http://dblp.uni-trier.de/db/conf/mmsec/mmsec2007.html#FridrichPK07},
+ year = 2007
+}
+
+@proceedings{DBLP:conf/mmsec/2007,
+ editor = {Deepa Kundur and
+ Balakrishnan Prabhakaran and
+ Jana Dittmann and
+ Jessica J. Fridrich},
+ title = {Proceedings of the 9th workshop on Multimedia {\&} Security,
+ MM{\&}Sec 2007, Dallas, Texas, USA, September 20-21, 2007},
+ booktitle = {MM{\&}Sec},
+ publisher = {ACM},
+ year = {2007},
+ isbn = {978-1-59593-857-2},
+ bibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+@inproceedings{DBLP:conf/mediaforensics/FillerJF10,
+ added-at = {2010-08-21T00:00:00.000+0200},
+ author = {Filler, Tomás and Judas, Jan and Fridrich, Jessica J.},
+ biburl = {http://www.bibsonomy.org/bibtex/23405985533dce431b5013941a2c2c2cc/dblp},
+ booktitle = {Media Forensics and Security},
+ crossref = {DBLP:conf/mediaforensics/2010},
+ editor = {Memon, Nasir D. and Dittmann, Jana and Alattar, Adnan M. and Delp, Edward J.},
+ ee = {http://dx.doi.org/10.1117/12.838002},
+ interhash = {a3d2215b959361a30f0b48f15c012bc9},
+ intrahash = {3405985533dce431b5013941a2c2c2cc},
+ isbn = {978-0-8194-7934-1},
+ keywords = {dblp},
+ pages = 754105,
+ publisher = {SPIE},
+ series = {SPIE Proceedings},
+ timestamp = {2010-08-21T00:00:00.000+0200},
+ title = {Minimizing embedding impact in steganography using trellis-coded quantization.},
+ url = {http://dblp.uni-trier.de/db/conf/mediaforensics/mediaforensics2010.html#FillerJF10},
+ volume = 7541,
+ year = 2010
+}
+
+
+@proceedings{DBLP:conf/mediaforensics/2010,
+ editor = {Nasir D. Memon and
+ Jana Dittmann and
+ Adnan M. Alattar and
+ Edward J. Delp},
+ title = {Media Forensics and Security II, part of the IS{\&}T-SPIE
+ Electronic Imaging Symposium, San Jose, CA, USA, January
+ 18-20, 2010, Proceedings},
+ booktitle = {Media Forensics and Security},
+ publisher = {SPIE},
+ series = {SPIE Proceedings},
+ volume = {7541},
+ year = {2010},
+ isbn = {978-0-8194-7934-1},
+ bibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+
+@article{Luo:2010:EAI:1824719.1824720,
+ author = {Luo, Weiqi and Huang, Fangjun and Huang, Jiwu},
+ title = {Edge adaptive image steganography based on LSB matching revisited},
+ journal = {Trans. Info. For. Sec.},
+ issue_date = {June 2010},
+ volume = {5},
+ number = {2},
+ month = jun,
+ year = {2010},
+ issn = {1556-6013},
+ pages = {201--214},
+ numpages = {14},
+ url = {http://dx.doi.org/10.1109/TIFS.2010.2041812},
+ doi = {10.1109/TIFS.2010.2041812},
+ acmid = {1824720},
+ publisher = {IEEE Press},
+ address = {Piscataway, NJ, USA},
+ keywords = {Content-based steganography, content-based steganography, least-significant-bit (LSB)-based steganography, pixel-value differencing (PVD), security, steganalysis},
+}
+
+@article{Mielikainen06,
+ author = {Mielikainen, J.},
+ title = {LSB Matching Revisited},
+ journal = {Signal Processing Letters},
+ year = {2006},
+ OPTkey = {},
+ volume = {13},
+ number = {5},
+ pages = {285--287},
+ month = may,
+ OPTnote = {},
+ OPTannote = {}
+}
+
\documentclass[draft,journal]{IEEEtran}
-%
-% If IEEEtran.cls has not been installed into the LaTeX system files,
-% manually specify the path to it like:
-% \documentclass[journal]{../sty/IEEEtran}
-
-
-
-
-
-% Some very useful LaTeX packages include:
-% (uncomment the ones you want to load)
-
-
-% *** MISC UTILITY PACKAGES ***
-%
-%\usepackage{ifpdf}
-% Heiko Oberdiek's ifpdf.sty is very useful if you need conditional
-% compilation based on whether the output is pdf or dvi.
-% usage:
-% \ifpdf
-% % pdf code
-% \else
-% % dvi code
-% \fi
-% The latest version of ifpdf.sty can be obtained from:
-% http://www.ctan.org/tex-archive/macros/latex/contrib/oberdiek/
-% Also, note that IEEEtran.cls V1.7 and later provides a builtin
-% \ifCLASSINFOpdf conditional that works the same way.
-% When switching from latex to pdflatex and vice-versa, the compiler may
-% have to be run twice to clear warning/error messages.
-
-
-
-
-
-
-% *** CITATION PACKAGES ***
-%
-%\usepackage{cite}
-% cite.sty was written by Donald Arseneau
-% V1.6 and later of IEEEtran pre-defines the format of the cite.sty package
-% \cite{} output to follow that of IEEE. Loading the cite package will
-% result in citation numbers being automatically sorted and properly
-% "compressed/ranged". e.g., [1], [9], [2], [7], [5], [6] without using
-% cite.sty will become [1], [2], [5]--[7], [9] using cite.sty. cite.sty's
-% \cite will automatically add leading space, if needed. Use cite.sty's
-% noadjust option (cite.sty V3.8 and later) if you want to turn this off.
-% cite.sty is already installed on most LaTeX systems. Be sure and use
-% version 4.0 (2003-05-27) and later if using hyperref.sty. cite.sty does
-% not currently provide for hyperlinked citations.
-% The latest version can be obtained at:
-% http://www.ctan.org/tex-archive/macros/latex/contrib/cite/
-% The documentation is contained in the cite.sty file itself.
-
-
-
-
-
-
-% *** GRAPHICS RELATED PACKAGES ***
-%
-\ifCLASSINFOpdf
- % \usepackage[pdftex]{graphicx}
- % declare the path(s) where your graphic files are
- % \graphicspath{{../pdf/}{../jpeg/}}
- % and their extensions so you won't have to specify these with
- % every instance of \includegraphics
- % \DeclareGraphicsExtensions{.pdf,.jpeg,.png}
-\else
- % or other class option (dvipsone, dvipdf, if not using dvips). graphicx
- % will default to the driver specified in the system graphics.cfg if no
- % driver is specified.
- % \usepackage[dvips]{graphicx}
- % declare the path(s) where your graphic files are
- % \graphicspath{{../eps/}}
- % and their extensions so you won't have to specify these with
- % every instance of \includegraphics
- % \DeclareGraphicsExtensions{.eps}
-\fi
-% graphicx was written by David Carlisle and Sebastian Rahtz. It is
-% required if you want graphics, photos, etc. graphicx.sty is already
-% installed on most LaTeX systems. The latest version and documentation can
-% be obtained at:
-% http://www.ctan.org/tex-archive/macros/latex/required/graphics/
-% Another good source of documentation is "Using Imported Graphics in
-% LaTeX2e" by Keith Reckdahl which can be found as epslatex.ps or
-% epslatex.pdf at: http://www.ctan.org/tex-archive/info/
-%
-% latex, and pdflatex in dvi mode, support graphics in encapsulated
-% postscript (.eps) format. pdflatex in pdf mode supports graphics
-% in .pdf, .jpeg, .png and .mps (metapost) formats. Users should ensure
-% that all non-photo figures use a vector format (.eps, .pdf, .mps) and
-% not a bitmapped formats (.jpeg, .png). IEEE frowns on bitmapped formats
-% which can result in "jaggedy"/blurry rendering of lines and letters as
-% well as large increases in file sizes.
-%
-% You can find documentation about the pdfTeX application at:
-% http://www.tug.org/applications/pdftex
-
-
-
-
-
-% *** MATH PACKAGES ***
-%
-%\usepackage[cmex10]{amsmath}
-% A popular package from the American Mathematical Society that provides
-% many useful and powerful commands for dealing with mathematics. If using
-% it, be sure to load this package with the cmex10 option to ensure that
-% only type 1 fonts will utilized at all point sizes. Without this option,
-% it is possible that some math symbols, particularly those within
-% footnotes, will be rendered in bitmap form which will result in a
-% document that can not be IEEE Xplore compliant!
-%
-% Also, note that the amsmath package sets \interdisplaylinepenalty to 10000
-% thus preventing page breaks from occurring within multiline equations. Use:
-%\interdisplaylinepenalty=2500
-% after loading amsmath to restore such page breaks as IEEEtran.cls normally
-% does. amsmath.sty is already installed on most LaTeX systems. The latest
-% version and documentation can be obtained at:
-% http://www.ctan.org/tex-archive/macros/latex/required/amslatex/math/
-
-
-
-
-
-% *** SPECIALIZED LIST PACKAGES ***
-%
-%\usepackage{algorithmic}
-% algorithmic.sty was written by Peter Williams and Rogerio Brito.
-% This package provides an algorithmic environment fo describing algorithms.
-% You can use the algorithmic environment in-text or within a figure
-% environment to provide for a floating algorithm. Do NOT use the algorithm
-% floating environment provided by algorithm.sty (by the same authors) or
-% algorithm2e.sty (by Christophe Fiorio) as IEEE does not use dedicated
-% algorithm float types and packages that provide these will not provide
-% correct IEEE style captions. The latest version and documentation of
-% algorithmic.sty can be obtained at:
-% http://www.ctan.org/tex-archive/macros/latex/contrib/algorithms/
-% There is also a support site at:
-% http://algorithms.berlios.de/index.html
-% Also of interest may be the (relatively newer and more customizable)
-% algorithmicx.sty package by Szasz Janos:
-% http://www.ctan.org/tex-archive/macros/latex/contrib/algorithmicx/
-
-
-
-
-% *** ALIGNMENT PACKAGES ***
-%
-%\usepackage{array}
-% Frank Mittelbach's and David Carlisle's array.sty patches and improves
-% the standard LaTeX2e array and tabular environments to provide better
-% appearance and additional user controls. As the default LaTeX2e table
-% generation code is lacking to the point of almost being broken with
-% respect to the quality of the end results, all users are strongly
-% advised to use an enhanced (at the very least that provided by array.sty)
-% set of table tools. array.sty is already installed on most systems. The
-% latest version and documentation can be obtained at:
-% http://www.ctan.org/tex-archive/macros/latex/required/tools/
-
-
-%\usepackage{mdwmath}
-%\usepackage{mdwtab}
-% Also highly recommended is Mark Wooding's extremely powerful MDW tools,
-% especially mdwmath.sty and mdwtab.sty which are used to format equations
-% and tables, respectively. The MDWtools set is already installed on most
-% LaTeX systems. The lastest version and documentation is available at:
-% http://www.ctan.org/tex-archive/macros/latex/contrib/mdwtools/
-
-
-% IEEEtran contains the IEEEeqnarray family of commands that can be used to
-% generate multiline equations as well as matrices, tables, etc., of high
-% quality.
-
-
-%\usepackage{eqparbox}
-% Also of notable interest is Scott Pakin's eqparbox package for creating
-% (automatically sized) equal width boxes - aka "natural width parboxes".
-% Available at:
-% http://www.ctan.org/tex-archive/macros/latex/contrib/eqparbox/
-
-
-
-
-
-% *** SUBFIGURE PACKAGES ***
-%\usepackage[tight,footnotesize]{subfigure}
-% subfigure.sty was written by Steven Douglas Cochran. This package makes it
-% easy to put subfigures in your figures. e.g., "Figure 1a and 1b". For IEEE
-% work, it is a good idea to load it with the tight package option to reduce
-% the amount of white space around the subfigures. subfigure.sty is already
-% installed on most LaTeX systems. The latest version and documentation can
-% be obtained at:
-% http://www.ctan.org/tex-archive/obsolete/macros/latex/contrib/subfigure/
-% subfigure.sty has been superceeded by subfig.sty.
-
-
-
-%\usepackage[caption=false]{caption}
-%\usepackage[font=footnotesize]{subfig}
-% subfig.sty, also written by Steven Douglas Cochran, is the modern
-% replacement for subfigure.sty. However, subfig.sty requires and
-% automatically loads Axel Sommerfeldt's caption.sty which will override
-% IEEEtran.cls handling of captions and this will result in nonIEEE style
-% figure/table captions. To prevent this problem, be sure and preload
-% caption.sty with its "caption=false" package option. This is will preserve
-% IEEEtran.cls handing of captions. Version 1.3 (2005/06/28) and later
-% (recommended due to many improvements over 1.2) of subfig.sty supports
-% the caption=false option directly:
-%\usepackage[caption=false,font=footnotesize]{subfig}
-%
-% The latest version and documentation can be obtained at:
-% http://www.ctan.org/tex-archive/macros/latex/contrib/subfig/
-% The latest version and documentation of caption.sty can be obtained at:
-% http://www.ctan.org/tex-archive/macros/latex/contrib/caption/
-
-
-
-
-% *** FLOAT PACKAGES ***
-%
-%\usepackage{fixltx2e}
-% fixltx2e, the successor to the earlier fix2col.sty, was written by
-% Frank Mittelbach and David Carlisle. This package corrects a few problems
-% in the LaTeX2e kernel, the most notable of which is that in current
-% LaTeX2e releases, the ordering of single and double column floats is not
-% guaranteed to be preserved. Thus, an unpatched LaTeX2e can allow a
-% single column figure to be placed prior to an earlier double column
-% figure. The latest version and documentation can be found at:
-% http://www.ctan.org/tex-archive/macros/latex/base/
-
-
-
-%\usepackage{stfloats}
-% stfloats.sty was written by Sigitas Tolusis. This package gives LaTeX2e
-% the ability to do double column floats at the bottom of the page as well
-% as the top. (e.g., "\begin{figure*}[!b]" is not normally possible in
-% LaTeX2e). It also provides a command:
-%\fnbelowfloat
-% to enable the placement of footnotes below bottom floats (the standard
-% LaTeX2e kernel puts them above bottom floats). This is an invasive package
-% which rewrites many portions of the LaTeX2e float routines. It may not work
-% with other packages that modify the LaTeX2e float routines. The latest
-% version and documentation can be obtained at:
-% http://www.ctan.org/tex-archive/macros/latex/contrib/sttools/
-% Documentation is contained in the stfloats.sty comments as well as in the
-% presfull.pdf file. Do not use the stfloats baselinefloat ability as IEEE
-% does not allow \baselineskip to stretch. Authors submitting work to the
-% IEEE should note that IEEE rarely uses double column equations and
-% that authors should try to avoid such use. Do not be tempted to use the
-% cuted.sty or midfloat.sty packages (also by Sigitas Tolusis) as IEEE does
-% not format its papers in such ways.
-
-
-%\ifCLASSOPTIONcaptionsoff
-% \usepackage[nomarkers]{endfloat}
-% \let\MYoriglatexcaption\caption
-% \renewcommand{\caption}[2][\relax]{\MYoriglatexcaption[#2]{#2}}
-%\fi
-% endfloat.sty was written by James Darrell McCauley and Jeff Goldberg.
-% This package may be useful when used in conjunction with IEEEtran.cls'
-% captionsoff option. Some IEEE journals/societies require that submissions
-% have lists of figures/tables at the end of the paper and that
-% figures/tables without any captions are placed on a page by themselves at
-% the end of the document. If needed, the draftcls IEEEtran class option or
-% \CLASSINPUTbaselinestretch interface can be used to increase the line
-% spacing as well. Be sure and use the nomarkers option of endfloat to
-% prevent endfloat from "marking" where the figures would have been placed
-% in the text. The two hack lines of code above are a slight modification of
-% that suggested by in the endfloat docs (section 8.3.1) to ensure that
-% the full captions always appear in the list of figures/tables - even if
-% the user used the short optional argument of \caption[]{}.
-% IEEE papers do not typically make use of \caption[]'s optional argument,
-% so this should not be an issue. A similar trick can be used to disable
-% captions of packages such as subfig.sty that lack options to turn off
-% the subcaptions:
-% For subfig.sty:
-% \let\MYorigsubfloat\subfloat
-% \renewcommand{\subfloat}[2][\relax]{\MYorigsubfloat[]{#2}}
-% For subfigure.sty:
-% \let\MYorigsubfigure\subfigure
-% \renewcommand{\subfigure}[2][\relax]{\MYorigsubfigure[]{#2}}
-% However, the above trick will not work if both optional arguments of
-% the \subfloat/subfig command are used. Furthermore, there needs to be a
-% description of each subfigure *somewhere* and endfloat does not add
-% subfigure captions to its list of figures. Thus, the best approach is to
-% avoid the use of subfigure captions (many IEEE journals avoid them anyway)
-% and instead reference/explain all the subfigures within the main caption.
-% The latest version of endfloat.sty and its documentation can obtained at:
-% http://www.ctan.org/tex-archive/macros/latex/contrib/endfloat/
-%
-% The IEEEtran \ifCLASSOPTIONcaptionsoff conditional can also be used
-% later in the document, say, to conditionally put the References on a
-% page by themselves.
-
-
-
-
-
-% *** PDF, URL AND HYPERLINK PACKAGES ***
-%
-%\usepackage{url}
-% url.sty was written by Donald Arseneau. It provides better support for
-% handling and breaking URLs. url.sty is already installed on most LaTeX
-% systems. The latest version can be obtained at:
-% http://www.ctan.org/tex-archive/macros/latex/contrib/misc/
-% Read the url.sty source comments for usage information. Basically,
-% \url{my_url_here}.
-
-
-
-
-
-% *** Do not adjust lengths that control margins, column widths, etc. ***
-% *** Do not use packages that alter fonts (such as pslatex). ***
-% There should be no need to do such things with IEEEtran.cls V1.6 and later.
-% (Unless specifically asked to do so by the journal or conference you plan
-% to submit to, of course. )
-
+\usepackage{subfig}
+\usepackage{color}
+\usepackage{graphicx}
% correct bad hyphenation here
\hyphenation{op-tical net-works semi-conduc-tor}
% was not built to handle multiple paragraphs
%
-\author{Jean-Fran\c cois Couchot, Raphael Couturier, and Christophe Guyeux*}
-
-\IEEEauthorblockA{FEMTO-ST Institute, UMR 6174 CNRS\\
-Computer Science Laboratory DISC\\
-University of Franche-Comt\'{e}\\
-Besan\c con, France\\
-\{jean-francois.couchot,raphael.couturier, christophe.guyeux\}@femto-st.fr}\\
+\author{Jean-Fran\c cois Couchot, Raphael Couturier, and Christophe Guyeux*
+ FEMTO-ST Institute, UMR 6174 CNRS\\
+ Computer Science Laboratory DISC\\
+ University of Franche-Comt\'{e}\\
+ Besan\c con, France\\
+ \{jean-francois.couchot,raphael.couturier, christophe.guyeux\}@femto-st.fr\\
* Authors in alphabetic order\\
}
-
-
-
-% \author{Michael~Shell,~\IEEEmembership{Member,~IEEE,}
-% John~Doe,~\IEEEmembership{Fellow,~OSA,}
-% and~Jane~Doe,~\IEEEmembership{Life~Fellow,~IEEE}% <-this % stops a space
-% \thanks{M. Shell is with the Department
-% of Electrical and Computer Engineering, Georgia Institute of Technology, Atlanta,
-% GA, 30332 USA e-mail: (see http://www.michaelshell.org/contact.html).}% <-this % stops a space
-% \thanks{J. Doe and J. Doe are with Anonymous University.}% <-this % stops a space
-% \thanks{Manuscript received April 19, 2005; revised January 11, 2007.}}
-
-% note the % following the last \IEEEmembership and also \thanks -
-% these prevent an unwanted space from occurring between the last author name
-% and the end of the author line. i.e., if you had this:
-%
-% \author{....lastname \thanks{...} \thanks{...} }
-% ^------------^------------^----Do not want these spaces!
-%
-% a space would be appended to the last name and could cause every name on that
-% line to be shifted left slightly. This is one of those "LaTeX things". For
-% instance, "\textbf{A} \textbf{B}" will typeset as "A B" not "AB". To get
-% "AB" then you have to do: "\textbf{A}\textbf{B}"
-% \thanks is no different in this regard, so shield the last } of each \thanks
-% that ends a line with a % and do not let a space in before the next \thanks.
-% Spaces after \IEEEmembership other than the last one are OK (and needed) as
-% you are supposed to have spaces between the names. For what it is worth,
-% this is a minor point as most people would not even notice if the said evil
-% space somehow managed to creep in.
-
-
-
-% The paper headers
-%\markboth{Journal of \LaTeX\ Class Files,~Vol.~6, No.~1, January~2007}%
-%{Shell \MakeLowercase{\textit{et al.}}: Bare Demo of IEEEtran.cls for Journals}
-% The only time the second header will appear is for the odd numbered pages
-% after the title page when using the twoside option.
-%
-% *** Note that you probably will NOT want to include the author's ***
-% *** name in the headers of peer review papers. ***
-% You can use \ifCLASSOPTIONpeerreview for conditional compilation here if
-% you desire.
-
-
-
-
-% If you want to put a publisher's ID mark on the page you can do it like
-% this:
-%\IEEEpubid{0000--0000/00\$00.00~\copyright~2007 IEEE}
-% Remember, if you use this you must call \IEEEpubidadjcol in the second
-% column for its text to clear the IEEEpubid mark.
-
-
-
-% use for special paper notices
-%\IEEEspecialpapernotice{(Invited Paper)}
-
-
-
-
+\newcommand{\JFC}[1]{\begin{color}{green}\textit{#1}\end{color}}
% make the title area
-\maketitle
+%\maketitle
\begin{abstract}
%\boldmath
The abstract goes here.
\end{abstract}
-% IEEEtran.cls defaults to using nonbold math in the Abstract.
-% This preserves the distinction between vectors and scalars. However,
-% if the journal you are submitting to favors bold math in the abstract,
-% then you can use LaTeX's standard command \boldmath at the very start
-% of the abstract to achieve this. Many IEEE journals frown on math
-% in the abstract anyway.
-
-% Note that keywords are not normally used for peerreview papers.
+
\begin{IEEEkeywords}
%IEEEtran, journal, \LaTeX, paper, template.
Steganography, least-significant-bit (LSB)-based steganography, edge detection, Canny filter, security, syndrome treillis code.
-
-% For peer review papers, you can put extra information on the cover
-% page as needed:
-% \ifCLASSOPTIONpeerreview
-% \begin{center} \bfseries EDICS Category: 3-BBND \end{center}
-% \fi
-%
-% For peerreview papers, this IEEEtran command inserts a page break and
-% creates the second title. It will be ignored for other modes.
\IEEEpeerreviewmaketitle
\section{Introduction}
-
+\input{intro.tex}
\section{Analysis of Steganographic Approaches}
+\input{analysis.tex}
This work considers digital images as covers and fondation is
-spatial least_significant-bit (LSB) replacement.
+spatial least significant-bit (LSB) replacement.
I this data hiding scheme a subset of all the LSB of the cover image is modified
with a secret bit stream depending on to a key, the cover, and the message to embed.
This well studied steganographic approach never decreases (resp. increases)
LSBR: to coarse (apply hugo breaker on it)
\section{Our Approach}
-Image Quality: Edge Image Steganography
+\input{ourapproach.tex}
-Security aspect:
-BBS-based cprotographic version of the message
+% Image Quality: Edge Image Steganography
-Enlarging embeding efficiency:
-Syndrome treillis code
+% Security aspect:
+% BBS-based cprotographic version of the message
+% Enlarging embeding efficiency:
+% Syndrome treillis code
+\input{stc.tex}
\section{Conclusion}
The conclusion goes here.
\subfloat[Data Embedding.]{
\begin{minipage}{0.49\textwidth}
\begin{center}
- \includegraphics[width=5cm]{emb.pdf}
+% \includegraphics[width=5cm]{emb.pdf}
+ \includegraphics[width=5cm]{emb.ps}
\end{center}
\end{minipage}
\label{fig:sch:emb}
\subfloat[Data Extraction.]{
\begin{minipage}{0.49\textwidth}
\begin{center}
- \includegraphics[width=5cm]{rec.pdf}
+% \includegraphics[width=5cm]{rec.pdf}
+ \includegraphics[width=5cm]{rec.ps}
\end{center}
\end{minipage}
\label{fig:sch:ext}
--- /dev/null
+#-*- coding:utf-8 -*-
+from os import system
+import Image as Im
+import ImageEnhance
+import PythonMagick as pm
+import numpy as np
+from ConfigParser import ConfigParser
+from random import *
+class Attaque:
+
+ @staticmethod
+ def _commun_in(mat):
+ (l,h)=mat.shape
+ at = Im.new("L",(l,h))
+ at.putdata(mat.flatten())
+ return (l,h,at)
+
+ @staticmethod
+ def _commun_out(at):
+ (l,h)=at.size
+ return np.array(at.getdata()).reshape((l,h))
+
+
+ @staticmethod
+ def rotation(mat,angle, nombre):
+ (l,h,at) = Attaque._commun_in(mat)
+ for k in range(nombre):
+ carreNoir=Im.new('L',(l*3,h*3),color=1)
+ carreNoir.paste(at,(l+1,h+1))
+ tourne = carreNoir.rotate(angle)
+ carreNoir = tourne.rotate(-angle)
+ carreNoir = carreNoir.crop((l+1,h+1,2*l+1,2*h+1))
+ #carreNoir = carreNoir.crop((l+1,h+1,2*l+1,2*h+1))
+
+ return Attaque._commun_out(carreNoir)
+
+
+ @staticmethod
+ def jpeg(mat,nom_temp,taux = 100):
+ '''Attaque par compression jpeg :
+ - taux = 100 : image d'origine,
+ - taux 75 : compression par défaut,
+ - taux = 1 : le plus fort taux de compression.'''
+ (l,h,at) = Attaque._commun_in(mat)
+ ch = nom_temp+'_'+str(taux)+'.jpg'
+ #TODO : utiliser le module de fichier temporaire de python
+ at.save(ch,quality = taux)
+ at = Im.open(ch)
+ #system('rm '+ch)
+ return Attaque._commun_out(at)
+
+
+ @staticmethod
+ def jp2(mat,nom_temp,taux = 100):
+ '''Attaque par compression jpeg :
+ - taux = 100 : image d'origine,
+ - taux 75 : compression par défaut,
+ - taux = 1 : le plus fort taux de compression.'''
+ (l,h,at) = Attaque._commun_in(mat)
+ at.save("img.bmp")
+ img_2_nm = "img_"+str(taux)+"_.jp2"
+
+ st = "convert img.bmp -define jp2:rate="+\
+ str(taux/float(100))+" "+img_2_nm
+ print st
+ system(st)
+ system("convert "+img_2_nm+" img_2.png")
+ atb = Im.open("img_2.png")
+ return Attaque._commun_out(atb)
+
+
+ @staticmethod
+ def decoupage(mat, taille = 50, position = (0,0)):
+ '''
+ Attaque par découpage de l'image.
+ '''
+ (_,_,at) = Attaque._commun_in(mat)
+ ch = '5007_dec_'+str(taille)+'.png'
+ if taille > 0 :
+ carreNoir=Im.new('L',(taille,taille))
+ carreNoir.putdata([0 for _ in range(taille**2)])
+ at.paste(carreNoir,position)
+# at.save(ch)
+ return Attaque._commun_out(at)
+
+
+ @staticmethod
+ def redimensionnement(mat, facteur, nombre = 1):
+ '''
+ Attaque par redimensionnement de l'image.
+ '''
+ (l,h,at) = Attaque._commun_in(mat)
+ for k in range(nombre):
+ atb = at.resize((int(l*facteur), int(h*facteur)))
+ atc = atb.resize((l,h))
+ return Attaque._commun_out(atc)
+
+ @staticmethod
+ def flou(mat,taux = 1):
+
+ '''
+ Attaque en jouant sur le flou/la netteté :
+ - taux = 1 : image d'origine,
+ - taux < 1 : image plus floue,
+ - taux > 1 : image plus nette.
+ '''
+ (_,_,at) = Attaque._commun_in(mat)
+ ch = '5007_flou_'+str(taux)+'.png'
+ amelioration = ImageEnhance.Sharpness(at)
+ atb = amelioration.enhance(taux)
+# atb.save(ch)
+ return Attaque._commun_out(atb)
+
+
+ @staticmethod
+ def contraste(mat,taux = 1):
+ ch = '5007_contrast_'+str(taux)+'.png'
+
+ '''
+ Attaque en jouant sur le flou/la netteté :
+ - taux = 1 : image d'origine,
+ - taux < 1 : image plus contrastée,
+ - taux > 1 : image plus nette.
+ '''
+ (_,_,at) = Attaque._commun_in(mat)
+ amelioration = ImageEnhance.Contrast(at)
+ atb = amelioration.enhance(taux)
+# atb.save(ch)
+ return Attaque._commun_out(atb)
+
+
+
+
+ @staticmethod
+ def allea_dwt(mat):
+ """ choisit une des 6 attaques au hasard avec paramètre cohérents au
+ hasard
+ """
+ nb_at = 6
+ choix = randint(0,5)
+ if choix == 0:
+ return Attaque.rotation(mat,30*random(), 1)
+ if choix == 1:
+ return Attaque.jp2(mat,"alea",int(100*random()))
+ if choix == 2:
+ return Attaque.decoupage(mat, 50, (0,0))
+ if choix == 3:
+ return Attaque.redimensionnement(mat, 0.75*randint(1,2),1)
+ if choix == 4:
+ return Attaque.flou(mat, 0.70+.6*random())
+ if choix == 5:
+ return Attaque.contraste(mat,0.70+.6*random())
+
+ @staticmethod
+ def enfloat(mat):
+ (l,c)=mat.shape
+ r=np.zeros((l,c))
+ for i in range(l):
+ for j in range(c) :
+ r[i][j]=float(mat[i][j])
+ return r
+
+
+ @staticmethod
+ def allea_dct(mat):
+ """ choisit une des 6 attaques au hasard avec paramètre cohérents au
+ hasard
+ """
+ r=None
+ nb_at = 6
+ choix = randint(0,6)
+ if choix == 0:
+ r=Attaque.rotation(mat,30*random(), 1)
+ if choix == 1:
+ r=Attaque.jp2(mat,"alea",int(100*random()))
+ if choix == 2:
+ r=Attaque.decoupage(mat, 50, (0,0))
+ if choix == 3:
+ r=Attaque.redimensionnement(mat, 0.75*randint(1,2),1)
+ if choix == 4:
+ r=Attaque.flou(mat, 0.70+.6*random())
+ if choix == 5:
+ r=Attaque.contraste(mat,0.70+.6*random())
+ if choix == 6:
+ r=Attaque.jpeg(mat,"alea",int(100*random()))
+
+ rp = Attaque.enfloat(r)
+ return rp
+
+
+ """
+ def bruitGaussien(self, ecarttype):
+ '''
+ Ajoute un bruit gaussien.
+ '''
+ for x in range(self._image.size[0]):
+ for y in range(self._image.size[1]):
+ self._image.putpixel((x,y),
+ int(random.normal(self._image.getpixel((x,y)), ecarttype)))
+
+
+ def bruitUniforme(self, ecart):
+ '''
+ Ajoute un bruit uniforme.
+ '''
+ for x in range(self._image.size[0]):
+ for y in range(self._image.size[1]):
+ self._image.putpixel((x,y),
+ self._image.getpixel((x,y)) + \
+ int(random.uniform(-ecart,ecart)))
+
+
+ """
--- /dev/null
+#-*-coding:utf-8-*-
+
+#############################################
+# Script réalisé dans le cadre du papier
+# concernant l'utilisation de plusieurs
+# fonctions chaotiques (pas seulement la
+# négation vectorielle) pour le tatouage.
+#
+# On utilise 3 fonctions différentes, on tatoue
+# dans le domaine ondelette.
+#############################################
+import pywt
+
+from numpy import *
+
+#from outilsBase import conversion, getBit, setBit
+from random import *
+from copy import deepcopy
+import Image as im
+from ImageChops import difference
+from suite import *
+from attaque import Attaque
+
+def matrice_to_bits(matrice):
+ '''
+ Renvoie la matrice des écritures binaires de matrice.
+ Les coefficients floants deviennent des chaînes (str) de bits.
+ '''
+ (m,n) = matrice.shape
+ retour = []
+ for l in range(m):
+ ligne = []
+ for c in range(n):
+ ligne.append(conversion(str(matrice[l,c]),2))
+ retour.append(ligne)
+ return retour
+
+
+
+def matrice_lscs(matrice,lscs):
+ '''
+ Matrice est une liste de listes, lscs est une liste.
+
+ A partir d'une matrice de coefficients binaires, vus comme
+ des chaines de caractères, extrait les bits dont les positions
+ sont données par la liste lscs.
+
+ Dans la liste lscs, un entier positif signifie devant la virgule,
+ un entier négatif signifie derrière. Le premier bit devant la
+ virgule est le bit 1, le premier bit derrière la virgule est le -1.
+
+ Le retour est une liste de bits (entiers).
+ '''
+ m,n = len(matrice), len(matrice[0])
+ retour = []
+ for l in range(m):
+ for c in range(n):
+ #num = str(round(float(matrice[l][c]),2))
+ num = matrice[l][c]
+
+ if '.' not in num:
+ ent,dec = num.replace('-',''),'0'
+ else:
+ ent,dec = num.replace('-','').split('.')
+ ent,dec = list(ent),list(dec)
+ ent.reverse()
+ for lsc in lscs:
+ if lsc > 0 and len(ent)>=lsc:
+ retour.append(ent[lsc-1])
+ elif lsc<0 and len(dec)>=abs(lsc):
+ retour.append(dec[abs(lsc)-1])
+ else:
+ retour.append('0')
+ return [int(k) for k in retour][:-3]
+
+
+def embarque(liste,matrice,lscs):
+ m,n = len(matrice), len(matrice[0])
+ retour = []
+ cpt = 0
+ for l in range(m):
+ for c in range(n):
+ if '-' in matrice[l][c]:
+ signe = '-'
+ else:
+ signe = ''
+ if '.' not in matrice[l][c]:
+ ent,dec = matrice[l][c].replace('-',''),'0'
+ else:
+ ent,dec = matrice[l][c].replace('-','').split('.')
+ ent,dec = list(ent),list(dec)
+ ent.reverse()
+ maximum = max([abs(k) for k in lscs])
+ ent = list(''.join(ent).zfill(maximum+2))
+ dec = list(''.join(dec).zfill(maximum+2))
+ print dec
+ for lsc in lscs:
+ if lsc > 0:
+ ent[lsc-1] = str(liste[cpt])
+ else:
+ dec[abs(lsc)-1] = str(liste[cpt])
+ cpt += 1
+ ent.reverse()
+ ent = ''.join(ent)
+ dec = ''.join(dec)
+ print ent+'.'+dec
+
+
+
+def f(L):
+ assert len(L)%4 == 1
+ n = len(L)/4
+ retour = [int(not L[k]) for k in range(n)]
+ retour.extend([L[k-n] for k in range(n,2*n)])
+ retour.extend([int(L[k-2*n])*int(not L[k+1]) for k in range(2*n,4*n)])
+ retour.extend([int(not L[2*n])])
+ return retour
+
+
+
+
+def f(L):
+ retour = [int(not L[0])]
+ retour.extend([L[k-1] for k in range(1,len(L))])
+ return retour
+
+
+
+
+def f(x):
+ rl=[]
+ k = 1
+ for el in x:
+ if k%2 != 0 :
+ rl.append(int(not el))
+ else:
+ rl.append(0 if sum(x[k-2:k])%2==0 else 1 )
+ k+=1
+ return rl
+
+
+
+
+def f(i,x):
+ r = 0
+ if i%2 == 0 :
+ r = int(not x[i])
+ else:
+ r = 0 if sum(x[i-1:i+1])%2==0 else 1
+ return r
+
+
+
+def f(i,L):
+ return int(not L[i])
+
+
+
+def embarque2(liste,matrice,lscs):
+
+ m,n = len(matrice), len(matrice[0])
+ retour = deepcopy(matrice)
+ cpt = 0
+ for l in range(m):
+ for c in range(n):
+ for lsc in lscs:
+ try:
+ retour[l,c] = setBit(str(retour[l,c]),lsc, liste[cpt])
+ cpt += 1
+ except:
+ pass
+ return retour
+
+def PSNR(mat1,mat2):
+ (li,co) = mat1.shape
+ '''
+ Retourne le PSNR entre deux images.
+ '''
+ from math import log
+ densite = 2**8-1
+ eqm = 0
+ for k in range(li):
+ for l in range(co):
+ eqm+=(mat1[k][l] - mat2[k][l])**2
+ r= float(eqm)/li/co
+ if r !=0:
+ return 10*log(densite**2/r,10)
+ else:
+ return "Infini"
+
+
+
+def diff(mat1,mat2):
+ lm=len(mat1)
+ cpt = 0
+ for k in range(lm):
+ if mat1[k] != mat2[k] :
+ cpt +=1
+ #print mat1[k],mat2[k]
+ return float(100)*cpt/lm
+
+def arrondi_en_entier(mat):
+ (l,c) = mat.shape
+ return array([[round(mat[i][j]) for j in range(c)]for i in range(l)])
+
+
+
+
+
+def experience(nom_fichier):
+ str_acc = "nom;"+nom_fichier
+
+ initiale_image = im.open(nom_fichier+".png")
+ (taillex,tailley) = initiale_image.size
+ initiale_matrice = array(initiale_image.getdata()).reshape((taillex,tailley))
+
+ #recup
+ hote_dct = Dct(nom_fichier+".png",idx_dct)
+ hote_dct2 = Dct(nom_fichier+".png",idx_dct)
+
+ initiale_dct= deepcopy(hote_dct.get_ext_dct())
+
+
+ # recup bits insignifiants
+ initiale_lscs = matrice_lscs(matrice_to_bits(initiale_dct),LSCs)
+ initiale_lscs_a_iterer = deepcopy(initiale_lscs)
+
+ # Nb LSCs
+ lm = len(initiale_lscs)
+ # Itérations D2
+ ciis = CIIS(random(),random(),random()/2,lm-1,lm)._genere()
+ for k in range(4*lm):
+ strat = ciis.next()
+ #print strat
+ initiale_lscs_a_iterer[strat] = int(
+ f(strat,initiale_lscs_a_iterer))
+
+
+
+ # Calcul du nombre de différences dans la matrice DCT
+
+
+ str_acc += ";#lscs;" + str(lm)
+
+
+ dif_iter = diff(initiale_lscs,initiale_lscs_a_iterer)
+ str_acc += ";#diff it ; " + str(dif_iter)
+
+
+ # Tatouage de la matrice")
+ marquee_ext_dct = embarque2(initiale_lscs_a_iterer,
+ initiale_dct,LSCs)
+
+ # reconstruction de la matrice complete
+ hote_dct2.set_ext_dct(marquee_ext_dct)
+ marquee_matrice = hote_dct2._matrice
+ marquee_matrice = arrondi_en_entier(marquee_matrice)
+
+
+ #sauvegarde de l'image
+ (l,h)=marquee_matrice.shape
+ at = im.new("L",(l,h))
+ at.putdata(marquee_matrice.flatten())
+ at.save(nom_fichier+"_bis.png")
+ at.show()
+
+
+#listing = os.listdir(path_cover)
+
+
+
+ # psnr
+ str_acc += ";PSNR;" + str(PSNR(initiale_matrice,marquee_matrice))
+
+
+ nbexp=10
+ # matrices attaquees par rotation
+ attaquee_matrice = []
+ print "rotations"
+ for k in range(nbexp):
+ at = Attaque.rotation(marquee_matrice,
+ 3*(k+1),
+ 1)
+ attaquee_matrice += [at]
+
+ # matrices attaquees compression jpeg
+ print "compression"
+ for k in range(nbexp):
+ at = Attaque.jpeg(marquee_matrice,
+ nom_fichier,
+ 100-3*(k+1))
+ attaquee_matrice += [at]
+
+
+ # matrices attaquees compression jp2000
+ print "compression jp2000"
+ for k in range(nbexp):
+ at = Attaque.jp2(marquee_matrice,
+ nom_fichier,
+ 100-10*(k+1))
+ attaquee_matrice += [at]
+
+
+
+ print "decoupage"
+ # matrices attaquees decoupage
+ for k in range(nbexp):
+ t = int(0.1*(k+1)*min(taillex,tailley))
+ at = Attaque.decoupage(marquee_matrice,
+ t,
+ (0,0))
+ attaquee_matrice += [at]
+
+ print "flou"
+ # matrices attaquees flou
+ for k in range(nbexp):
+ t=0.6+0.08*(k+1)
+ at = Attaque.flou(marquee_matrice,t)
+ attaquee_matrice += [at]
+
+ print "contraste"
+ # matrices attaquees contrast
+ for k in range(nbexp):
+ t=0.6+0.08*(k+1)
+ at = Attaque.contraste(marquee_matrice,t)
+ attaquee_matrice += [at]
+
+
+ # matrices attaquees redimensionnement
+ print "dimensionnement"
+ attaquee_matrice += [Attaque.redimensionnement(marquee_matrice,
+ 0.75,
+ 1)]
+ attaquee_matrice += [Attaque.redimensionnement(marquee_matrice,
+ 1.5,
+ 1)]
+
+
+
+
+ print "nombre d'attaques",len(attaquee_matrice)
+
+ # evaluation des attaques
+ _,(marquee_H2,marquee_V2,marquee),(_,_,_) = \
+ pywt.wavedec2(marquee_matrice,
+ 'db1',
+ level = 2)
+ marquee_lscs = matrice_lscs(matrice_to_bits(marquee_matrice),LSCs)
+
+ c=0
+ for am in attaquee_matrice:
+ c +=1
+ attaquee = am
+
+ attaquee_lscs = matrice_lscs(matrice_to_bits(attaquee),LSCs)
+ d = diff(marquee_lscs,attaquee_lscs)
+ str_acc += ";" + str(d)
+
+
+
+ return str_acc
+
+
+"""
+for j in sample(range(1,3001),2):
+ print experience("../images/"+str(j),3)
+
+"""
+print experience("../images/"+str(3622),3)
--- /dev/null
+#-*-coding:utf-8-*-
+
+#############################################
+# Script réalisé dans le cadre du papier
+# concernant l'utilisation de plusieurs
+# fonctions chaotiques (pas seulement la
+# négation vectorielle) pour le tatouage.
+#
+# On utilise 3 fonctions différentes, on tatoue
+# dans le domaine ondelette.
+#############################################
+
+from numpy import *
+from sobel555_for_ensemble import *
+from bbs import *
+
+#from outilsBase import conversion, getBit, setBit
+from random import *
+from copy import deepcopy
+import Image as im
+from ImageChops import difference
+from attaque import Attaque
+
+def matrice_to_bits(matrice):
+ '''
+ Renvoie la matrice des écritures binaires de matrice.
+ Les coefficients floants deviennent des chaînes (str) de bits.
+ '''
+ (m,n) = matrice.shape
+ retour = []
+ for l in range(m):
+ ligne = []
+ for c in range(n):
+ ligne.append(conversion(str(matrice[l,c]),2))
+ retour.append(ligne)
+ return retour
+
+
+
+def matrice_lscs(matrice,lscs):
+ '''
+ Matrice est une liste de listes, lscs est une liste.
+
+ A partir d'une matrice de coefficients binaires, vus comme
+ des chaines de caractères, extrait les bits dont les positions
+ sont données par la liste lscs.
+
+ Dans la liste lscs, un entier positif signifie devant la virgule,
+ un entier négatif signifie derrière. Le premier bit devant la
+ virgule est le bit 1, le premier bit derrière la virgule est le -1.
+
+ Le retour est une liste de bits (entiers).
+ '''
+ m,n = len(matrice), len(matrice[0])
+ retour = []
+ for l in range(m):
+ for c in range(n):
+ #num = str(round(float(matrice[l][c]),2))
+ num = matrice[l][c]
+
+ if '.' not in num:
+ ent,dec = num.replace('-',''),'0'
+ else:
+ ent,dec = num.replace('-','').split('.')
+ ent,dec = list(ent),list(dec)
+ ent.reverse()
+ for lsc in lscs:
+ if lsc > 0 and len(ent)>=lsc:
+ retour.append(ent[lsc-1])
+ elif lsc<0 and len(dec)>=abs(lsc):
+ retour.append(dec[abs(lsc)-1])
+ else:
+ retour.append('0')
+ return [int(k) for k in retour][:-3]
+
+
+def embarque(liste,matrice,lscs):
+ m,n = len(matrice), len(matrice[0])
+ retour = []
+ cpt = 0
+ for l in range(m):
+ for c in range(n):
+ if '-' in matrice[l][c]:
+ signe = '-'
+ else:
+ signe = ''
+ if '.' not in matrice[l][c]:
+ ent,dec = matrice[l][c].replace('-',''),'0'
+ else:
+ ent,dec = matrice[l][c].replace('-','').split('.')
+ ent,dec = list(ent),list(dec)
+ ent.reverse()
+ maximum = max([abs(k) for k in lscs])
+ ent = list(''.join(ent).zfill(maximum+2))
+ dec = list(''.join(dec).zfill(maximum+2))
+ print dec
+ for lsc in lscs:
+ if lsc > 0:
+ ent[lsc-1] = str(liste[cpt])
+ else:
+ dec[abs(lsc)-1] = str(liste[cpt])
+ cpt += 1
+ ent.reverse()
+ ent = ''.join(ent)
+ dec = ''.join(dec)
+ print ent+'.'+dec
+
+
+
+def f(L):
+ assert len(L)%4 == 1
+ n = len(L)/4
+ retour = [int(not L[k]) for k in range(n)]
+ retour.extend([L[k-n] for k in range(n,2*n)])
+ retour.extend([int(L[k-2*n])*int(not L[k+1]) for k in range(2*n,4*n)])
+ retour.extend([int(not L[2*n])])
+ return retour
+
+
+
+
+def f(L):
+ retour = [int(not L[0])]
+ retour.extend([L[k-1] for k in range(1,len(L))])
+ return retour
+
+
+
+
+def f(x):
+ rl=[]
+ k = 1
+ for el in x:
+ if k%2 != 0 :
+ rl.append(int(not el))
+ else:
+ rl.append(0 if sum(x[k-2:k])%2==0 else 1 )
+ k+=1
+ return rl
+
+
+
+
+def f(i,x):
+ r = 0
+ if i%2 == 0 :
+ r = int(not x[i])
+ else:
+ r = 0 if sum(x[i-1:i+1])%2==0 else 1
+ return r
+
+
+
+def f(i,L):
+ return int(not L[i])
+
+
+
+def embarque2(liste,matrice,lscs):
+
+ m,n = len(matrice), len(matrice[0])
+ retour = deepcopy(matrice)
+ cpt = 0
+ for l in range(m):
+ for c in range(n):
+ for lsc in lscs:
+ try:
+ retour[l,c] = setBit(str(retour[l,c]),lsc, liste[cpt])
+ cpt += 1
+ except:
+ pass
+ return retour
+
+def PSNR(mat1,mat2):
+ (li,co) = mat1.shape
+ '''
+ Retourne le PSNR entre deux images.
+ '''
+ from math import log
+ densite = 2**8-1
+ eqm = 0
+ for k in range(li):
+ for l in range(co):
+ eqm+=(mat1[k][l] - mat2[k][l])**2
+ r= float(eqm)/li/co
+ if r !=0:
+ return 10*log(densite**2/r,10)
+ else:
+ return "Infini"
+
+
+
+def diff(mat1,mat2):
+ lm=len(mat1)
+ cpt = 0
+ for k in range(lm):
+ if mat1[k] != mat2[k] :
+ cpt +=1
+ #print mat1[k],mat2[k]
+ return float(100)*cpt/lm
+
+def arrondi_en_entier(mat):
+ (l,c) = mat.shape
+ return array([[round(mat[i][j]) for j in range(c)]for i in range(l)])
+
+
+
+
+def sauve(data,outfile="dummy.png",file_msg="invader.png"):
+ (l,h)=im.open(file_msg).size
+ outIm = im.new('L',im.open(file_msg).size)
+ queue = [255 if x != 0 else 0 for x in data]
+ queue = queue[len(queue)-l*h:]
+ outIm.putdata(queue)
+ outIm.save("apresattaque.png")
+
+
+
+
+def retrouve_message_parametre(file_msg="invader.png"):
+
+ bbs = BlumBlumShub();
+ bbs.setN(M)
+ bbs.setSeed(X)
+
+ message = []
+ for c in [x if x==0 else 1 for x in im.open(file_msg).getdata()]:
+ message +=[c]
+
+ leng_msg=len(message)
+ leng='%08d'%len(message)
+ len_leng=len(leng)
+ leng_error=int(len_leng)
+ leng_cor=leng
+ List_pack=a2b_list(leng_cor)
+ List_pack += message
+ #print List_pack
+ leng_msg=len(List_pack)
+
+ List_random=[]
+ while len(List_random)<leng_msg:
+ List_random.extend(Denary2Binary(bbs.next()))
+
+
+ Message=[(int(List_pack[l])^int(List_random[l])) for l in xrange(len(List_pack))]
+ return (leng_msg,Message,List_random)
+
+
+
+
+
+def experience(nom_fichier,leng_msg,Message,List_random):
+# print "message initial",Message
+ bit_to_read = 1
+ dd = im.open(nom_fichier)
+ dd = dd.convert('RGB')
+ red, green, blue = dd.split()
+ level=red.copy()
+ at = level
+ (l,h)=red.size
+ marquee_matrice = np.array(at.getdata()).reshape((l,h))
+ level= array(level.getdata()).flatten()
+
+
+ ############# construire ici les attaques
+ nbexp=1
+ # matrices attaquees par rotation
+ attaquee_matrice = []
+ print "rotations"
+ for k in range(nbexp):
+ at = Attaque.rotation(marquee_matrice,
+ 90,
+ 1)
+
+ m = [((abs(marquee_matrice-at)[i,j]),(i,j)) for i in xrange(l) for j in xrange(h)]
+
+ #m = sorted(m.items(), key=itemgetter(0))
+
+ print "diffence max", m
+
+ attaquee_matrice += [at]
+
+ """
+
+ # matrices attaquees compression jpeg
+ print "compression"
+ for k in range(nbexp):
+ at = Attaque.jpeg(marquee_matrice,
+ nom_fichier,
+ 100-3*(k+1))
+ attaquee_matrice += [at]
+
+
+ # matrices attaquees compression jp2000
+ print "compression jp2000"
+ for k in range(nbexp):
+ at = Attaque.jp2(marquee_matrice,
+ nom_fichier,
+ 100-10*(k+1))
+ attaquee_matrice += [at]
+
+
+
+ print "decoupage"
+ # matrices attaquees decoupage
+ for k in range(nbexp):
+ t = int(0.1*(k+1)*min(taillex,tailley))
+ at = Attaque.decoupage(marquee_matrice,
+ t,
+ (0,0))
+ attaquee_matrice += [at]
+
+ print "flou"
+ # matrices attaquees flou
+ for k in range(nbexp):
+ t=0.6+0.08*(k+1)
+ at = Attaque.flou(marquee_matrice,t)
+ attaquee_matrice += [at]
+
+ print "contraste"
+ # matrices attaquees contrast
+ for k in range(nbexp):
+ t=0.9#0.6+0.08*(k+1)
+ at = Attaque.contraste(marquee_matrice,t)
+ attaquee_matrice += [at]
+
+
+ # matrices attaquees redimensionnement
+ print "dimensionnement"
+ attaquee_matrice += [Attaque.redimensionnement(marquee_matrice,
+ 0.75,
+ 1)]
+ attaquee_matrice += [Attaque.redimensionnement(marquee_matrice,
+ 1.5,
+ 1)]
+
+
+
+ """
+
+ print "nombre d'attaques",len(attaquee_matrice)
+
+
+
+ c=0
+ for am in attaquee_matrice:
+ c +=1
+ attaquee = am
+ im2 = im.new('L',dd.size)
+ im2.putdata(attaquee.flatten())
+ im2.save("apresRot.png")
+
+
+
+
+
+
+ #attaquee.copy()
+ print im2,dd,leng_msg
+ [List_bit_to_change2,Weight2]=compute_filter_canny(im2,dd,leng_msg)
+ # on a mis dd et leng_msg : c'est juste pour la taille.
+ #level2= array(level.getdata()).flatten()
+
+ level2= array(im2.getdata()).flatten()
+
+ print "support2",len(List_bit_to_change2)
+ print "weight2",len(Weight2)
+
+ alpha = float(len(List_bit_to_change2))/len(Message)
+ assert alpha >= 2
+ index = min(int(alpha),9)
+ H_hat2 = {
+ 2 : [71,109],
+ 3 : [95, 101, 121],
+ 4 : [81, 95, 107, 121],
+ 5 : [75, 95, 97, 105, 117],
+ 6 : [73, 83, 95, 103, 109, 123],
+ 7 : [69, 77, 93, 107, 111, 115, 121],
+ 8 : [69, 79, 81, 89, 93, 99, 107, 119],
+ 9 : [69, 79, 81, 89, 93, 99, 107, 119, 125]
+ }[index]
+
+
+
+ Stc_message2=[getBit(level2[l],bit_to_read) for l in List_bit_to_change2]
+ LL2=list(List_bit_to_change2)
+
+ print "Level",max([level2[l]-level[l] for l in xrange(len(Stc_message2))])
+ #print "List bit to change",max([LL2[l]-LL1[l] for l in xrange(len(Stc_message2))])
+ #print "Stc message", max([Stc_message[l]-Stc_message2[l] for l in xrange(len(Stc_message))])
+
+ Message2 = [x%2 for x in prod(H_hat2,len(Message),Stc_message2)]
+
+ print "Message final",Message2
+ #print equiv(Message,Message2)
+
+ #print "fini"
+
+ l=0
+ val_mod2=0
+ list_msg=[]
+ decoded_msg=""
+
+ MessageDecoded2=[(int(Message2[l])^int(List_random[l])) for l in xrange(len(Message2))]
+# print conv_list_bit(''.join([`MessageDecoded2[i]` for i in xrange(leng_error*8)]))
+# print int(conv_list_bit(''.join([`MessageDecoded2[i]` for i in xrange(leng_error*8)])))
+
+ #print "MessageDecoded2",MessageDecoded2
+ #print conv_list_bit(''.join([`MessageDecoded2[i]` for i in xrange(len(Message2))]))
+
+
+ sauve(MessageDecoded2)
+
+ return MessageDecoded2
+
+
+
+
+
+
+def main():
+ path_stego = '/home/couchot/rech/CCG12/canny/stc/exp/raphus/stego/'
+ path_cover = '/home/couchot/rech/BCG10/Oxford11/experiments/images/'
+ list_nb_bit=[]
+ l=0
+ listing = [957, 108, 106, 29, 431, 924, 262, 477, 346, 809]
+ listing = [809]
+ (leng_msg,Message,List_random) = retrouve_message_parametre()
+ print "params :", leng_msg,len(Message),List_random[0:5]
+ for infile in listing:
+ # if l<10:
+ fi = path_cover+str(infile)+'.png'
+ fo = path_stego+str(infile)+'.png'
+ experience(fo,leng_msg,Message,List_random)
+ l+=1
+
+if __name__ == "__main__":
+ main()
+
+
+
+
+
+
processed= array(processed.getdata()).flatten()
List7=set(compute_list_bit_to_change(100,processed))
- #nb_bit_embedded=(512*512/10)+40
+
nb_bit_embedded=max(2*MsgLen,int(len(List3)/MsgLen)*MsgLen)
print "nb_bit_embedded",nb_bit_embedded
AvailablePixel3=List3
sub = range(len(level2))
- #print "avail P3",len(AvailablePixel3)
- #print "avail P5",len(AvailablePixel5)
- #print "avail P7",len(AvailablePixel7)
+ print "avail P3",len(AvailablePixel3)
+ print "avail P5",len(AvailablePixel5)
+ print "avail P7",len(AvailablePixel7)
Weight=[0 for _ in sub]
+def verifie(fileout,leng_msg,Message,):
+ global M,X
+ bit_to_read = 1
+ dd2 = im.open(fileout)
+ dd2 = dd2.convert('RGB')
+ red2, green, blue = dd2.split()
+ level2=red2.copy()
+
+ [List_bit_to_change2,Weight2]=compute_filter_canny(level2,dd2,leng_msg)
+
+
+ level2= array(level2.getdata()).flatten()
+
+ print "support2",len(List_bit_to_change2)
+ print "message2",len(Message)
+ print "weight2",len(Weight2)
+
+ alpha = float(len(List_bit_to_change2))/len(Message)
+ assert alpha >= 2
+ index = min(int(alpha),9)
+ H_hat2 = {
+ 2 : [71,109],
+ 3 : [95, 101, 121],
+ 4 : [81, 95, 107, 121],
+ 5 : [75, 95, 97, 105, 117],
+ 6 : [73, 83, 95, 103, 109, 123],
+ 7 : [69, 77, 93, 107, 111, 115, 121],
+ 8 : [69, 79, 81, 89, 93, 99, 107, 119],
+ 9 : [69, 79, 81, 89, 93, 99, 107, 119, 125]
+ }[index]
+
+
+ print H_hat2
+ Stc_message2=[getBit(level2[l],bit_to_read) for l in List_bit_to_change2]
+ LL2=list(List_bit_to_change2)
-def mystego(filein, fileout):
+ """
+ print "Level",max([level2[l]-level[l] for l in xrange(len(Stc_message2))])
+ print "List bit to change",max([LL2[l]-LL1[l] for l in xrange(len(Stc_message))])
+ print "Stc message", max([Stc_message[l]-Stc_message2[l] for l in xrange(len(Stc_message))])
+ """
+ Message2 = [x%2 for x in prod(H_hat2,len(Message),Stc_message2)]
+ level2=Message2
+
+# print "mesg",Message
+# print "mesg2",Message2
+
+ l=0
+ val_mod2=0
+ list_msg=[]
+ decoded_msg=""
+
+
+
+ bbs = BlumBlumShub();
+ bbs.setN(M)
+ bbs.setSeed(X)
+
+ List_random=[]
+ while len(List_random)<len(Message2):
+ List_random.extend(Denary2Binary(bbs.next()))
+
+
+
+ MessageDecoded2=[(int(Message2[l])^int(List_random[l])) for l in xrange(len(Message2))]
+# print conv_list_bit(''.join([`MessageDecoded2[i]` for i in xrange(leng_error*8)]))
+# print int(conv_list_bit(''.join([`MessageDecoded2[i]` for i in xrange(leng_error*8)])))
+
+ #print "MessageDecoded2",MessageDecoded2
+
+ outIm = im.new("L",im.open("invader.png").size)
+ (l,h) = outIm.size
+ print "taille de l'image",l*h
+ print "taille des donneées",len(MessageDecoded2)
+ queue = [255 if x != 0 else 0 for x in MessageDecoded2]
+ queue = queue[len(queue)-l*h:]
+ outIm.putdata(queue)
+ outIm.save("apresSobel.png")
+
+"""
+ print conv_list_bit(''.join([`MessageDecoded2[i]` for i in xrange(len(Message2))]))
+ for l in List_bit_to_change2:
+ if(val_mod2<leng_error*8):
+ list_msg.append(`getBit(level2[l],bit_to_read)^int(List_random[val_mod2])`)
+ if(val_mod2==leng_error*8-1):
+ bin_leng2=''.join(list_msg)
+ coded_msg2=conv_list_bit(bin_leng2)
+ clear_msg2=coded_msg2
+ length_msg=int(clear_msg2)
+ list_msg=[]
+ if(val_mod2>=leng_error*8 and val_mod2<leng_error*8+length_msg*leng_error):
+ list_msg.append(`getBit(level2[l],bit_to_read)^int(List_random[val_mod2])`)
+ if(len(list_msg)==leng_error*8):
+ pack=''.join(list_msg)
+ msg=conv_list_bit(pack)
+ decoded_msg=decoded_msg+msg
+ list_msg=[]
+ val_mod2+=1
+ l=l+1
+ print decoded_msg#[0:20]
+"""
+
+
+
+
+
+def mystego(filein, fileout,file_msg="invader"):
bit_to_read = 1
global M,X
bbs = BlumBlumShub();
dd = dd.convert('RGB')
red, green, blue = dd.split()
level=red.copy()
+
+ #print type(level),level
"""
"""
-
+
message = []
for c in [x if x==0 else 1 for x in im.open("invader.png").getdata()]:
message +=[c]
#print List_pack
leng_msg=len(List_pack)
+ print "leng_msg",leng_msg
[List_bit_to_change,Weight]=compute_filter_canny(level,dd,leng_msg)
level= array(level.getdata()).flatten()
List_random=[]
- while len(List_random)<len(List_bit_to_change):
+ while len(List_random)<len(List_pack):
List_random.extend(Denary2Binary(bbs.next()))
-
+
#print List_bit_to_change
Support=[]
Message=[(int(List_pack[l])^int(List_random[l])) for l in xrange(len(List_pack))]
#print "support",len(List_bit_to_change)
- #print "message",len(Message)
+ #print "message",Message
#print "weight",len(Weight)
+ #(x_b,Stc_message,H_hat) = stc(Support,Weight,Message)
+
(x_b,Stc_message,H_hat) = stc(Support,Weight,Message)
+ print "comparaison entre stc_message et message", len(Stc_message),len(Message)
+
+
#print "pourcentage modif",nbdif(x_b,Stc_message)
#print "taille Stc_message",len(Stc_message)
# Stc_message=Message
zz3.save(fileout)
#zz4.show()
+ verifie(fileout,leng_msg,Message)
- """
-
- dd2 = im.open(fileout)
- dd2 = dd2.convert('RGB')
- red2, green, blue = dd2.split()
- level2=red2.copy()
-
- [List_bit_to_change2,Weight2]=compute_filter_canny(level2,dd2,leng_msg)
-
-
- level2= array(level2.getdata()).flatten()
-
- print "support2",len(List_bit_to_change2)
- print "message2",len(Message)
- print "weight2",len(Weight2)
-
- alpha = float(len(List_bit_to_change2))/len(Message)
- assert alpha >= 2
- index = min(int(alpha),9)
- H_hat2 = {
- 2 : [71,109],
- 3 : [95, 101, 121],
- 4 : [81, 95, 107, 121],
- 5 : [75, 95, 97, 105, 117],
- 6 : [73, 83, 95, 103, 109, 123],
- 7 : [69, 77, 93, 107, 111, 115, 121],
- 8 : [69, 79, 81, 89, 93, 99, 107, 119],
- 9 : [69, 79, 81, 89, 93, 99, 107, 119, 125]
- }[index]
-
-
- print H_hat,H_hat2
-
-
- Stc_message2=[getBit(level2[l],bit_to_read) for l in List_bit_to_change2]
- LL1=list(List_bit_to_change);
- LL2=list(List_bit_to_change2)
-
- print "Level",max([level2[l]-level[l] for l in xrange(len(Stc_message2))])
- print "List bit to change",max([LL2[l]-LL1[l] for l in xrange(len(Stc_message))])
- print "Stc message", max([Stc_message[l]-Stc_message2[l] for l in xrange(len(Stc_message))])
-
- Message2 = [x%2 for x in prod(H_hat2,len(Message),Stc_message2)]
- level2=Message2
-
-# print "mesg",Message
-# print "mesg2",Message2
-
- print equiv(Message,Message2)
- print "fini"
-
- l=0
- val_mod2=0
- list_msg=[]
- decoded_msg=""
-
- MessageDecoded2=[(int(Message2[l])^int(List_random[l])) for l in xrange(len(Message2))]
-# print conv_list_bit(''.join([`MessageDecoded2[i]` for i in xrange(leng_error*8)]))
-# print int(conv_list_bit(''.join([`MessageDecoded2[i]` for i in xrange(leng_error*8)])))
-
- print "MessageDecoded2",MessageDecoded2
- print conv_list_bit(''.join([`MessageDecoded2[i]` for i in xrange(len(Message2))]))
-
-
-
-
-
-
-# for l in List_bit_to_change2:
-# if(val_mod2<leng_error*8):
-# list_msg.append(`getBit(level2[l],bit_to_read)^int(List_random[val_mod2])`)
-# if(val_mod2==leng_error*8-1):
-# bin_leng2=''.join(list_msg)
-# coded_msg2=conv_list_bit(bin_leng2)
-# clear_msg2=coded_msg2
-# length_msg=int(clear_msg2)
-# list_msg=[]
-# if(val_mod2>=leng_error*8 and val_mod2<leng_error*8+length_msg*leng_error):
-# list_msg.append(`getBit(level2[l],bit_to_read)^int(List_random[val_mod2])`)
-# if(len(list_msg)==leng_error*8):
-# pack=''.join(list_msg)
-# msg=conv_list_bit(pack)
-# decoded_msg=decoded_msg+msg
-# list_msg=[]
-# val_mod2+=1
-# l=l+1
-
- print decoded_msg#[0:20]
- print len(List_bit_to_change)
- list_nb_bit.append(filein)
- list_nb_bit.append(len(List_bit_to_change2))
-
-"""
-
-
-#path_cover = '/localhome/couturie/ensemble/cover_bad_laplace/'
-path_stego = '/home/couchot/rech/CCG12/canny/stc/exp/raphus/stego/'
-path_cover = '/home/couchot/rech/BCG10/Oxford11/experiments/images/'
-#path_stego = '/tmp/'
-#path_stego = '/home/couturie/BossBase-1.0-canny/'
-#listing = os.listdir(path_cover)
-
-
-list_nb_bit=[]
-l=0
# entree sortie
+def main():
+ path_stego = '/home/couchot/rech/CCG12/canny/stc/exp/raphus/stego/'
+ path_cover = '/home/couchot/rech/BCG10/Oxford11/experiments/images/'
+ list_nb_bit=[]
+ l=0
+ listing = [957, 108, 106, 29, 431, 924, 262, 477, 346, 809]
+ for infile in listing:
+ # if l<10:
+ fi = path_cover+str(infile)+'.png'
+ fo = path_stego+str(infile)+'.png'
+ mystego(fi,fo)
+ l+=1
-
-listing = [957, 108, 106, 29, 431, 924, 262, 477, 346, 809]
-
-for infile in listing:
-# if l<10:
- fi = path_cover+str(infile)+'.png'
- fo = path_stego+str(infile)+'.png'
- mystego(fi,fo)
- l+=1
-
-#f = open('histogram_boss_canny_100255', 'w')
-#f = open('histogram', 'w')
-#for item in list_nb_bit:
-#f.write("%s\n" % item)
+if __name__ == "__main__":
+ main()