質問: cv2.imread('target.jpg') cv2.imwrite('after.jpg', im) ``` ### 試したこと 下記を参考に、IMWRITE_JPEG_QUALITYなどjpg書き出し時の設定値をすべて試して書き出したのですが、やはりファイルサイズが大きくなってしまいます。 https://docs.opencv.org/3.4.3/d4/da8/group__imgcodecs.html また、読み込み元jpgと書き出し後jpgをwinmergeやimagemagickを用いて比較したところ、 確かに大きな差分が確認できるのですが、その原因が何なのか不明な状態です。 上記原因と、ファイルサイズをあまり変えずに書き出す方法をご教授いただけると助かります。 よろしくお願いいたします。
回答: JPGが「率を指定できる方式で圧縮された画像保存形式」であるためにおきます。 大元の画像を1MBとします。 1大元の画像 1MB ↓ (A率でJPGにして保存) ↓ 2taraget.jpg 1.2KB ↓ (読み込み) ↓ 3読み込んだ画像 1MB ↓ (B率で3をJPGにして保存) ↓ 4after.jpg 1.6KB こういう流れになっているためです。 ファイルサイズが重要であるならば、tiitoiさんが回答で示されているように 圧縮率(上記の例でいうとB率のところ)を調整しましょう。 ただ、JPGは非可逆圧縮であるため圧縮率をあげる(QUALITYを下げる)と 画像のノイズは当然大きくなります また、大元の画像からみれば、すでにtarget.jpgになった時点でノイズがのっていて その上にさらにかけることになる点も注意しましょう。