2015年3月18日水曜日

[Python][OpenCV]OpenCVで余白削除 その2

# -*- coding:utf-8 -*-
import cv2

img = cv2.imread('cropped.jpg')
img2 = cv2.imread('cropped.jpg')

# Grayscale に変換
img_gs = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 2 値化
ret, thresh = cv2.threshold(img_gs, 250, 255, cv2.THRESH_BINARY)

# 輪郭を取得
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# i = 1 は画像全体の外枠になるのでカウントに入れない
x1 = []
y1 = []
x2 = []
y2 = []
for i in range(1, len(contours)):
    # ret の中身は (x, y, w, h)
    ret = cv2.boundingRect(contours[i])
    x1.append(ret[0])
    y1.append(ret[1])
    x2.append(ret[0] + ret[2])
    y2.append(ret[1] + ret[3])

x1_min = min(x1)
y1_min = min(y1)
x2_max = max(x2)
y2_max = max(y2)

# 枠取りをした結果を表示
cv2.rectangle(img, (x1_min, y1_min), (x2_max, y2_max), (0, 255, 0), 2)
cv2.imwrite('cropped_edge_rectangle.jpg', img)

# ギリギリで切り出し
crop_img = img2[y1_min:y2_max, x1_min:x2_max]
cv2.imwrite('cropped_edge.jpg', crop_img)

# 少し余白を付けて付けて切り出し
offset = 100
y1_min -= offset
y2_max += offset
x1_min -= offset
x2_max += offset
crop_img = img2[y1_min:y2_max, x1_min:x2_max]
cv2.imwrite('cropped_edge_offset.jpg', crop_img)
元画像

枠取りをした結果

ギリギリで切り出した結果

少し余白を付けて切り出した結果

[Python][PIL] PILを使ってAutoCrop(余白削除)

# -*- coding:utf-8 -*-
import Image, ImageChops
import numpy as np

image = Image.open('cropped.jpg')

# getpixel(0, 0) で左上の色を取得し、背景色のみの画像を作成する
bg = Image.new(image.mode, image.size, image.getpixel((0, 0)))

# 背景色画像と元画像の差分を取得
diff = ImageChops.difference(image, bg)
#diff.show()
diff = ImageChops.add(diff, diff, 2.0, -100)
#diff.show()
# 黒背景の境界Boxを取り出す
bbox = diff.getbbox()
# 少し余白を付ける
offset=30
bbox2 = (bbox[0] - offset, bbox[1] - offset, bbox[2] + offset, bbox[3] + offset)
# 元画像を切り出す
cropped = image.crop(bbox)
cropped.save('cropped_edge.jpg')
cropped = image.crop(bbox2)
cropped.save('cropped_edge_offset.jpg')
元画像

ギリギリで切り出し

少し余白を付けて切り出し

[Python][OpenCV]OpenCVで余白削除

# -*- coding:utf-8 -*-
import cv2

img = cv2.imread('test.png')
img2 = cv2.imread('test.png')

# Grayscale に変換
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 結果を表示
#cv2.imshow('img', img)
#cv2.imshow('img2', img2)

# 2 値化
ret, thresh = cv2.threshold(img2, 250, 255, cv2.THRESH_BINARY)
#cv2.imshow('thresh', thresh)

# 輪郭を取得
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# i = 1 は画像全体の外枠になるのでカウントに入れない
x1 = []
y1 = []
x2 = []
y2 = []
for i in range(1, len(contours)):
    # ret の中身は (x, y, w, h)
    ret = cv2.boundingRect(contours[i])
    x1.append(ret[0])
    y1.append(ret[1])
    x2.append(ret[0] + ret[2])
    y2.append(ret[1] + ret[3])

x1_min = min(x1)
y1_min = min(y1)
x2_max = max(x2)
y2_max = max(y2)
cv2.rectangle(img, (x1_min, y1_min), (x2_max, y2_max), (0, 255, 0), 2)
cv2.imshow('img', img)
cv2.imwrite('test_cropRectangle.png', img)

crop_img = img2[y1_min:y2_max, x1_min:x2_max]
cv2.imshow('crop_img', crop_img)
cv2.imwrite('test_cropped.png', crop_img)

cv2.waitKey(0)
cv2.destroyAllWindows()
元画像

全画像の外枠検出結果

余白削除結果

[Python][OpenCV]画像の上下左右を削除(trim)する

# -*- coding:utf-8 -*-
import cv2

img = cv2.imread('BunkoSample_noise.jpg')
height, width = img.shape[:2]

offset = 100
# 開始座標
x = offset # 横座標(左起点)
y = offset # 縦座標(上起点)
# crop する画像サイズ
w = width - offset * 2
h = height - offset * 2
crop_img = img[y:y+h, x:x+w]
# IMWRITE_JPEG_QUALITY を指定しない時 (default) と quality = 95 は同じサイズになる
cv2.imwrite('cropped_default.jpg', crop_img)
cv2.imwrite('cropped_95.jpg', crop_img, [cv2.IMWRITE_JPEG_QUALITY, 95])
cv2.imwrite('cropped_75.jpg', crop_img, [cv2.IMWRITE_JPEG_QUALITY, 75])
cv2.imwrite('cropped_60.jpg', crop_img, [cv2.IMWRITE_JPEG_QUALITY, 60])
cv2.imwrite('cropped_50.jpg', crop_img, [cv2.IMWRITE_JPEG_QUALITY, 50])
cv2.imwrite('cropped_30.jpg', crop_img, [cv2.IMWRITE_JPEG_QUALITY, 30])
元画像(左上と右下にゴミ線が入っている)

上下左右を100dotずつ削った結果

出力されたファイルサイズ
$ ls -l
-rw-rw-r-- 1 xxxx xxxx 283451  3月 18 13:58 BunkoSample_noise.jpg
-rw-rw-r-- 1 xxxx xxxx 238097  3月 18 22:59 cropped_30.jpg
-rw-rw-r-- 1 xxxx xxxx 277427  3月 18 22:59 cropped_50.jpg
-rw-rw-r-- 1 xxxx xxxx 296614  3月 18 22:59 cropped_60.jpg
-rw-rw-r-- 1 xxxx xxxx 341120  3月 18 22:59 cropped_75.jpg
-rw-rw-r-- 1 xxxx xxxx 575140  3月 18 22:59 cropped_95.jpg
-rw-rw-r-- 1 xxxx xxxx 575140  3月 18 22:59 cropped_default.jpg

[Python][OpenCV]Python用OpenCVのインストール

Ubuntu ソフトウェアセンターで以下のものをインストールする
  • python-opencv

[Python][OpenCV]画像サイズを取得

# -*- coding:utf-8 -*-
import cv2

img = cv2.imread('test.jpg')
print "img.shape=", img.shape
height, width = img.shape[:2]
print "height=", height
print "width=", width
実行結果
$ python getImageSize.py 
img.shape= (1802, 1150, 3)
height= 1802
width= 1150

2015年3月17日火曜日

[Elisp] OSを判別する

*scratch* で下記をテスト
(print system-configuration)

"i686-pc-linux-gnu"
"i686-pc-linux-gnu"
(string-match "linux" system-configuration)
8

(string-match "mingw" system-configuration)
nil

2015年3月1日日曜日

robocopy

ファイルの移動
オプション
/MOVEファイルおよびディレクトリを移動、移動後はソースから削除する
/R:0コピー失敗時の再試行回数を 0 にする
/Eサブディレクトリをコピー。空のディレクトリもコピーする
robocopy C:\src C:\dst /MOVE /R:0 /E

[Linux] PDF ファイルのプロパティ表示

PDF ファイルのプロパティを表示する
$ exiftool HighlightFileFormat.pdf 
ExifTool Version Number         : 9.46
File Name                       : HighlightFileFormat.pdf
Directory                       : .
File Size                       : 252 kB
File Modification Date/Time     : 2015:03:01 06:07:51+09:00
File Access Date/Time           : 2015:03:01 06:08:06+09:00
File Inode Change Date/Time     : 2015:03:01 06:07:54+09:00
File Permissions                : rw-r-----
File Type                       : PDF
MIME Type                       : application/pdf
PDF Version                     : 1.4
Linearized                      : Yes
Modify Date                     : 2003:06:18 14:57:03-08:00
Create Date                     : 2003:04:15 16:05:06Z
Page Count                      : 8
Creation Date                   : 2003:04:15 16:05:06Z
Mod Date                        : 2003:06:18 14:57:03-08:00
Producer                        : Acrobat Distiller 5.0.5 for Macintosh
Author                          : Adobe Developer Support
Metadata Date                   : 2003:06:18 14:57:03-08:00
Creator                         : Adobe Developer Support
Title                           : Highlight File Format
Page Mode                       : UseOutlines
PDF にプロパティ値を書き込む
$ exiftool -Title="test title" -Author="someone" test.pdf

[ImageMagick]JPGからPDF変換

$ convert test/*.jpg test.pdf
test フォルダにある全ての jpg ファイルを 1 つの PDF ファイルにまとめる

[ImageMagick]PDFからJPEG変換

$ convert test.pdf test/%03d.jpg
test フォルダ下に 000.jpg, 001.jpg, 002.jpg と分割されていく