OpenCV-Python Tutorials (5) ~Image Processing in OpenCV~
OpenCV-Python Tutorialsã®è¨äºï¼Image Processing in OpenCV ã®ç« ã® Morphological Transformationsï¼ Image Gradientsï¼Image Pyramids ãè¦ã¦ããï¼
å ¬å¼ï¼Image Processing in OpenCV — OpenCV-Python Tutorials 1 documentation
ãã®ä¸ã§è©¦ããã³ã¼ãã¯GitHubã«ç½®ãã¦ãããã¨ã«ï¼
ç»åã®å¾é
ç®æ¨
ãã®ç« ã§ã¯ï¼æ¬¡ã®ãã¨ãå¦ã¶
- ç»åã®å¾é ï¼ã¨ãã¸ãªã©ãè¦ã¤ãã
- 次ã®ãããªé¢æ°ãæ±ãï¼cv2.Sobel(), cv2.Scharr(), cv2.Laplacian()ãªã©
çè«
OpenCVã¯3種é¡ã®å¾é ãã£ã«ã¿ã¾ãã¯ãã¤ãã¹ãã£ã«ã¿ï¼Sobel, Scharr, Laplacian ãæä¾ãã¦ããï¼ããããè¦ã¦ãããï¼
1. Sobel and Scharr Derivatives
Sobelã®æ¼ç®ã¯ã¬ã¦ã·ã¢ã³å¹³æ»åã¨å¾®åæ¼ç®ã®çµã¿åããããã®ã§ï¼ãããã¤ãºã«å¼·ãï¼åãã¹ãå°é¢æ°ã®æ¹åãï¼æ°´å¹³æ¹åãåç´æ¹åãï¼å¼æ°ã¯ããããyorder
ã¨xorder
ï¼ãæå®ãããã¨ãã§ããï¼å¼æ°ksize
ã«ãã£ã¦ã«ã¼ãã«ã®å¤§ãããæå®ãããã¨ãã§ããï¼ããï¼ksize=-1ãªãï¼3x3ã®Sobelãã£ã«ã¿ããè¯ãçµæãåºã3x3ã®Scharrãã£ã«ã¿ã使ãããï¼ä½¿ããã¦ãããã£ã«ã¿ã¯ããã¥ã¡ã³ãã§ç¢ºèªãããï¼
2. Laplacian Derivatives
ä¸ããããç»åã®ã©ãã©ã·ã¢ã³ã次ã®é¢ä¿ã§è¨ç®ããï¼ï¼ããã¯Sobelå°é¢æ°ãç¨ãã¦è¦ã¤ããããããã®å°é¢æ°ã§ããï¼
ksize = 1
ãªãï¼æ¬¡ã®ã«ã¼ãã«ããã£ã«ã¿ã¨ãã¦ä½¿ãããï¼
ã³ã¼ã
次ã®ã³ã¼ãã¯ä¸ã¤ã®å³å½¢ã«å¯¾ãã¦ã®ãã¹ã¦ã®æ¼ç®å¦çãè¦ããï¼ã«ã¼ãã«ã®å¤§ããã¯ãã¹ã¦5x5ã ï¼ np.uint8åã®çµæãå¾ãã®ã«ï¼åºåç»åã® depth ã¯-1ã渡ãããï¼
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('dave.jpg',0) laplacian = cv2.Laplacian(img, cv2.CV_64F) sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5) sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5) plt.subplot(2, 2, 1), plt.imshow(img, cmap = 'gray') plt.title('Original'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 2, 2), plt.imshow(laplacian, cmap = 'gray') plt.title('Laplacian'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 2, 3), plt.imshow(sobelx, cmap = 'gray') plt.title('Sobel X'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 2, 4), plt.imshow(sobely, cmap = 'gray') plt.title('Sobel Y'), plt.xticks([]), plt.yticks([]) plt.show()
çµæï¼
大äºãªåé¡
ãã£ãã®ä¾ã§ã¯ï¼åºåã®ãã¼ã¿å㯠cv2.CV_8U ã¾ã㯠np.uint8 ã ãï¼å°ãåé¡ãããï¼é»ããç½ã¸ã®å¤åã¯æ£ã®å¾ãï¼æ£ã®å¤ï¼ã¨ãã¦æããããä¸æ¹ï¼ç½ããé»ã¸ã®å¤åã¯è² ã®å¾ãï¼è² ã®å¤ï¼ã¨æããããï¼å¾ã£ã¦ï¼np.uint8 ã«ãã¼ã¿ãå¤æããã¨ãã«ã¯ï¼è² ã®å¾ãã®ãã®ã¯ãã¹ã¦0ã¨ããã¦ãã¾ãï¼è¨ãæããã¨ï¼ã¨ãã¸ãè¦è½ã¨ãã¦ãã¾ãï¼
ããï¼ã©ã¡ãã®ã¨ãã¸ãæ¤åºããã«ã¯ï¼åºåã®ãã¼ã¿åã cv2.CV_16S, cv2.CV_64F ãªã©ã®ãããªé«ãã¬ãã«ã®ãã®ã§ä¿æããå¦çããã¦ï¼çµ¶å¯¾å¤ãã¨ã£ã¦ cv2.CV_8U ã«æ»ãå¤æãããã®ãè¯ãï¼ä¸ã®ã³ã¼ãã¯æ°´å¹³æ¹åã®Sobelãã£ã«ã¿ã«å¯¾ãã¦ãã®å¦çããã¦ï¼çµæã®å·®ãè¦ããã®ã ï¼
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('box.png', 0) # Output dtype = cv2.CV_8U sobelx8u = cv2.Sobel(img, cv2.CV_8U, 1, 0, ksize=5) # Output dtype = cv2.CV_64F. Then take its absolute and convert to cv2.CV_8U sobelx64f = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5) abs_sobel64f = np.absolute(sobelx64f) sobel_8u = np.uint8(abs_sobel64f) plt.subplot(1, 3, 1), plt.imshow(img, cmap = 'gray') plt.title('Original'), plt.xticks([]), plt.yticks([]) plt.subplot(1, 3, 2), plt.imshow(sobelx8u, cmap = 'gray') plt.title('Sobel CV_8U'), plt.xticks([]), plt.yticks([]) plt.subplot(1, 3, 3), plt.imshow(sobel_8u, cmap = 'gray') plt.title('Sobel abs(CV_64F)'), plt.xticks([]), plt.yticks([]) plt.show()
çµæï¼
Cannyã¨ãã¸æ¤åº
ç®æ¨
ãã®ç« ã§ã¯ï¼æ¬¡ã®ãã¨ã«ã¤ãã¦å¦ã¶
- Cannyã¨ãã¸æ¤åºã®ã³ã³ã»ãã
- OpenCVã®é¢æ°ï¼cv2.Canny()
çè«
Cannyã¨ãã¸æ¤åºã¯æåãªã¨ãã¸æ¤åºã®ã¢ã«ã´ãªãºã ã ï¼1986å¹´ã«John F. Cannyã«ãã£ã¦çºæãããï¼ããã¯è¤æ°æ®µéã®ã¢ã«ã´ãªãºã ã ãï¼ããããã«ã¤ãã¦è¦ã¦ãããï¼
1. ãã¤ãºå¦ç
ç»åä¸ã®ãã¤ãºã«ã¨ãã¸æ¤åºã¯å½±é¿ãããããããï¼æåã®ã¹ãããã§ã¯5x5ã®ã¬ã¦ã·ã¢ã³ãã£ã«ã¿ã使ã£ã¦ãã¤ãºãåãé¤ãï¼ããã«ã¤ãã¦ã¯åã®ç« ã§æ¢ã«ã¿ãï¼
2. ç»åã®å¾é 強度ãè¦ã¤ãã
æ°´å¹³æ¹å()ã¨åç´æ¹å(
)ã®1次å°é¢æ°ãæ±ããããã«ï¼å¹³æ»åãããç»åã«æ°´å¹³ã¨åç´ã®ä¸¡æ¹åã¸Sobelã«ã¼ãã«ã§ãã£ã«ã¿ã¼ããããï¼ãããäºã¤ã®ç»åããï¼ããããã®ãã¯ã»ã«ã«æ¬¡ã®ãããªå¦çããããã¨ã§ã¨ãã¸ã®å¾é
ã¨æ¹åãç¥ããã¨ãã§ããï¼
å¾é ã®æ¹åã¯å¸¸ã«ã¨ãã¸ã«å¯¾ãã¦åç´ã§ããï¼ããã¯åç´ï¼æ°´å¹³ï¼2ã¤ã®å¯¾è§ç·ã®4ã¤ã®æ¹åã®ä¸ã®1ã¤ã«è¿ä¼¼ãããï¼
3. Non-maximal suppression(å±æçã«æ大å¤ä»¥å¤ã0ã«æãã)
å¾é ã®å¤§ããã¨æ¹åãåå¾ããå¾ï¼ã¨ãã¸ã ã¨èãããã¦ããªããã¯ã»ã«ãé¤ãå¦çãç»åå ¨ä½ã«å¯¾ãã¦è¡ãï¼ãã®ããã«ï¼ãã¹ã¦ã®ãã¯ã»ã«ã«å¯¾ãã¦ï¼å¾é æ¹åã®è¿åã§å±æçã«æ大ãã©ããã確ãããï¼ä¸ã®ç»åãè¦ã¦ã¿ããï¼

ç¹Aã¯ï¼åç´æ¹åã®ï¼ã¨ãã¸ä¸ã«ããï¼å¾é ã®æ¹åã¯ã¨ãã¸ã«å¯¾ãã¦åç´ã ï¼ç¹Bã¨Cã¯å¾é æ¹åã®ç´ç·ä¸ã«ããï¼ãããã£ã¦ï¼ç¹Bã¨Cã使ã£ã¦å±æçã«æ大ããè¦ããã¨ã§ç¹Aã確ããããã¨ãã§ããï¼ãããããªãã°æ¬¡ã®æ®µéãèãããï¼ããã§ãªããªãã°æããããï¼0ã«ç½®ãæããããï¼ï¼
è¦ããã«ï¼å¾ãããçµæã¯"ç´°ãã¨ãã¸"ã®äºå¤åç»åã ï¼
4. Hysteresis Thresholding
ãã®æ®µéã§ã¯ï¼ã©ããæ¬å½ã®ã¨ãã¸ã§ã©ããããã§ãªããã決ããï¼ãã®ããï¼minVal 㨠maxVal ã®2ã¤ã®é¾å¤ãå¿ è¦ã¨ãªãï¼å¾é ã®å¼·åº¦ã maxVal ããã大ãããã®ã¯ã¨ãã¸ã§ minVal ããå°ãããã®ã¯ã¨ãã¸ã§ã¯ãªãã¨ãã¦ç ´æ£ãããï¼2ã¤ã®é¾å¤ã®éã«ãããã®ã¯é£çµåº¦ã«åºã¥ãã¦ã¨ãã¸ã§ãããã¨ãã¸ã§ãªããã«åé¡ãããï¼ããï¼"確ããªã¨ãã¸"ã«ã¤ãªãã£ã¦ããã°ï¼ã¨ãã¸ã®ä¸é¨ã§ããã¨èããããï¼ããã§ãªããã°ï¼ç ´æ£ãããï¼æ¬¡ã®å³ãè¦ã¦ã¿ããï¼

ã¨ãã¸A㯠maxVal ãä¸åã£ã¦ãã¦ï¼"確ããªã¨ãã¸"ã§ããã¨èããããï¼ã¨ãã¸C㯠maxValãä¸åã£ã¦ãããï¼ã¨ãã¸Aã«ã¤ãªãã£ã¦ããã®ã§æ£å½ãªã¨ãã¸ã§ããã¨èãããï¼ã«ã¼ãå ¨ä½ãå¾ãï¼ãããï¼ã¨ãã¸B㯠minVal ãä¸åã£ã¦ãããã¨ãã¸Cã¨åãç¯å²ã«ããï¼"確ããªã¨ãã¸"ã«ã¤ãªãã£ã¦ããªãããç ´æ£ãããï¼ãããã£ã¦ï¼æ£ããçµæãå¾ãããã« minVal 㨠maxVal ãé©åã«é¸æãå¿ è¦ãããï¼ã¨ã¦ãéè¦ã ï¼
ãã®æ®µéã§ã¯ã¾ãã¨ãã¸ã¯é·ãç·ã§ããã¨ããä»®å®ã«åºã¥ãï¼å°ããªãã¯ã»ã«ã®ãã¤ãºãåãé¤ãï¼
ãã£ã¦ï¼æå¾ã«å¾ããããã®ã¯ç»åä¸ã®å¼·ãã¨ãã¸ã ï¼
OpenCVã§ã®Cannyã¨ãã¸æ¤åº
OpenCVã¯ä¸ã§è¿°ã¹ããã®ãã¹ã¦ãä¸ã¤ã®å¦çã¨ãã¦ï¼cv2.Canny() ãç¨æãã¦ããï¼ã©ã®ããã«ä½¿ãããè¦ã¦ãããï¼æåã®å¼æ°ã¯å
¥åç»åï¼2çªç®ã¨3çªç®ã®å¼æ°ã¯ãããã minVal 㨠maxVal ã ï¼3çªç®ã®å¼æ°ã¯Sobelãªãã¬ã¼ã¿ã®ã¢ãã¼ãã£ãµã¤ãºã§ï¼ããã©ã«ãã§ã¯3ã«ãªã£ã¦ããï¼æå¾ã®å¼æ°ã¯å¾é
ã®å¤§ãããè¦ã¤ããããã®å¹³ååã表ã L2gradient ã ï¼ãããããTrue
ãªãï¼ããæ£ç¢ºãªå¹³ååã使ããããï¼ããã§ãªããã°æ¬¡ã®é¢æ°ã使ãããï¼ï¼ããã©ã«ãã§ã¯
False
ã§ããï¼
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('messi.jpg', 0) edges = cv2.Canny(img, 100, 200) plt.subplot(121), plt.imshow(img, cmap='gray') plt.title('Original Image'), plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(edges, cmap = 'gray') plt.title('Edge Image'), plt.xticks([]), plt.yticks([]) plt.show()
çµæï¼
追å è³æ
次ã®ãµã¤ãã¨ããåèã«ãã¾ãã
ç·´ç¿
- é¾å¤ã2ã¤ã®ãã©ãã¯ãã¼ã使ã£ã¦æ§ã ãªå¤ã«ã§ããCannyã¨ãã¸æ¤åºæ©ã®ã¢ããªã±ã¼ã·ã§ã³ãä½ããï¼ãããããã¨ã§é¾å¤ã®å¹æãç解åºæ¥ãï¼
Image Pyramids
ç®æ¨
ãã®ç« ã§ã¯ï¼
- Image Pyramidsã«ã¤ãã¦å¦ã¶
- æ°ãããã«ã¼ã"Orapple"ãä½ãããã«Image Pyramidsã使ã
- 次ã®é¢æ°ãè¦ã¦ããï¼cv2.pyrUp(), cv2.pyrDown()
çè«
é常ï¼ä¸å®ã®å¤§ããã®ç»åãæ±ã£ã¦ããï¼ãããå¹¾ã¤ãã®å ´åï¼ç§ãã¡ã¯åãç»åã®ç°ãªã解å度ã®ç»åãæ±ãå¿ è¦ãããï¼ä¾ãã°ï¼ç»åä¸ã®é¡ãªã©ã®ä½ããæ¢ãæï¼ç»åä¸ã§ã©ã®å¤§ããã§ç¾ãããã¯ããã£ã¦ããªãï¼ãã®å ´åï¼ç°ãªã解å度ã®ç»åã»ãããä½ã£ã¦ç»åä¸ã§ãã®å¯¾è±¡ç©ãæ¢ãå¿ è¦ãããï¼ãã®ç°ãªã解å度ã®ç»åã»ããã®ãã¨ãPyramidsã¨å¼ã¶ï¼ãªããªãã¹ã¿ãã¯ã«ããããæ ¼ç´ããæï¼ä¸çªå¤§ããªç»åãä¸ã§ä¸çªå°ããªç»åããããã«ããã®ããã©ãããã®ããã«è¦ããããã ï¼ï¼
2種é¡ã®Image Pyramidsãããï¼1) Gaussian Pyramid 㨠2) Laplacian Pyramids ã ï¼
Gaussian Pyramid ã®é«ãã¬ãã«ï¼ä½ã解å度ï¼ã¯ä½ãã¬ãã«ï¼é«ã解å度ï¼ã®ç»åã®ä¸ã®é£ç¶ããè¡ã¨åãåé¤ãããã¨ã«ãã£ã¦å½¢æãããï¼ããã¦é«ãã¬ãã«ã®ããããã®ãã¯ã»ã«ã¯ä¸ã®ã¬ãã«ã®5ãã¯ã»ã«ãã¬ã¦ã·ã¢ã³ã®éã¿ä»ãããã contribution from ã«ãã£ã¦å½¢æãããï¼ãããããã¨ã§ã®ç»åã
ã®ç»åã«ãªãï¼ãã£ã¦ï¼é¢ç©ã¯4åã®1ã«æ¸å°ããï¼ãã㯠Octave ã¨å¼ã°ããï¼ãã©ãããã®ä¸ã«åãã£ã¦åããã¿ã¼ã³ãç¶ããï¼ããªãã¡ï¼è§£å度ã¯æ¸å°ãã¦ããï¼ï¼åãããã«æ¡å¼µããå ´åã¯ï¼é¢ç©ã¯ããããã®ã¬ãã«ã§4åã«ãªãï¼cv2.pyrDown()ã¨cv2.pryUp()é¢æ°ã使ã£ã¦ Gaussian Pyramid ãè¦ã¤ãããã¨ãã§ããï¼
img = cv2.imread('messi.jpg')
lower_reso = cv2.pyrDown(higher_reso)
ä¸ã®ãã®ã image pyramid ã®4段éã ï¼

cv2.pyrUp()é¢æ°ã§ image pyramid ãä¸ã«é²ããã¨ãã§ããï¼
higher_reso2 = cv2.pyrUp(lower_reso)
higher_reso2 㯠higher_zero ã¨åãã§ã¯ãªããã¨ã«æ³¨æãããï¼ãªããªãä¸åº¦è§£å度ãä¸ããã¨ï¼æ å ±ã¯å¤±ããã¦ãã¾ãããã ï¼æ¬¡ã®ç»åã¯ï¼åã«ç¤ºããä¸çªå°ããç»åããã¤ãããããã©ãããã3段ééãããã®ã ï¼å ã®ç»åã¨æ¯è¼ãããï¼

Laplacian Pytamids 㯠Gaussian Pyramids ããçæãããï¼ãã®ããã®é¢æ°ã¯åå¨ããªãï¼Laplacian pyramid ã®ç»åã¯ã¨ãã¸ç»åã®ãããªãã®ã ãã§ï¼å¤ãã®è¦ç´ ã¯ã¼ãã ï¼ãããã¯ç»åå§ç¸®ã§ä½¿ãããï¼Laplacian Pyramid ã®ããã¬ãã«ã¯ Gaussian Pyramid ã®ã¬ãã«éã®éã㨠Gaussian Pyramid ã®ä¸ã®ã¬ãã«ã®æ¡å¼µãããã®ã«ãã£ã¦ä½ãããï¼Laplacian ã¬ãã«ã®3段éã¯æ¬¡ã®ããã«ãªãï¼ã³ã³ãã©ã¹ãã¯ã³ã³ãã³ããããããããããã«èª¿æ´ãã¦ããï¼ï¼

ãã©ãããã使ã£ãç»åã®åæ
ãã©ãããã®1ã¤ã®ã¢ããªã±ã¼ã·ã§ã³ãç»åã®åæã ï¼ä¾ãã°ï¼ç»åã®ã¤ãªãåããã§ã¯ï¼2ã¤ã®ç»åãç©ã¿éããå¿ è¦ããããï¼ç»åã®éã®ä¸é£ç¶æ§ã«ãã£ã¦ããæãã«è¦ããªããããããªãï¼ãã®å ´åï¼ãã©ãããã使ã£ãç»åã®åæã¯ç»åä¸ã®å¤ãã®ãã¼ã¿ã失ããã«ã·ã¼ã ã¬ã¹ãªåæãåºæ¥ãï¼1ã¤ã®å¤å ¸çãªä¾ããªã¬ã³ã¸ã¨ãªã³ã´ã®2ã¤ã®æç©ã®åæã ï¼ä½ãè¨ããã¨ãã¦ããããç解ããããã«çµæãè¦ããï¼

追å è³æã®æåã®ãªãã¡ã¬ã³ã¹ã«ã¯ï¼Laplacian Pyramids ãªã©ã®å³è¡¨ã使ã£ãç»åã®åæï¼image blendingï¼ã®èª¬æãããã¦ããã®ã§ãã§ãã¯ãã¦ãããï¼ç°¡åãªå¦çã®æµãã¯ä»¥ä¸ã®ã¨ããã ï¼
- ãããã¨ãªã¬ã³ã¸ã®2ã¤ã®ç»åãèªã¿è¾¼ã
- ãããã¨ãªã¬ã³ã¸ã® Gaussian Pyramids ãæ±ããï¼ãã®å®è·µä¾ã§ã¯ï¼ã¬ãã«ã¯6ã ï¼
- Gaussian Pyramids ããï¼ãã® Laplacian Pyramids ãæ±ããï¼
- ãããã®å·¦ååã¨ãªã¬ã³ã¸ã®å³ååã Laplacian Pyramids ã®ããããã®ã¬ãã«ã§ã¤ãªãã
- æå¾ã«ãã®ã¤ãªãã image pyramids ããå ã®ç»åãåæ§ç¯ãã
ä¸ãã³ã¼ãå ¨ä½ã ï¼ï¼ç°¡åã®ããï¼ä½åãªã¡ã¢ãªãã¨ã£ã¦ããããã®æ®µéãåãã¦è¡ã£ã¦ããï¼ããããã£ããæé©åã§ããï¼ï¼
import cv2 import numpy as np,sys A = cv2.imread('apple.jpg') B = cv2.imread('orange.jpg') G = A.copy() gpA = [G] for i in xrange(6): G = cv2.pyrDown(gpA[i]) gpA.append(G) G = B.copy() gpB = [G] for i in xrange(6): G = cv2.pyrDown(gpB[i]) gpB.append(G) lpA = [gpA[5]] for i in xrange(5, 0, -1): size = (gpA[i-1].shape[1], gpA[i-1].shape[0]) GE = cv2.pyrUp(gpA[i], dstsize = size) L = cv2.subtract(gpA[i-1], GE) lpA.append(L) lpB = [gpB[5]] for i in xrange(5, 0, -1): size = (gpB[i-1].shape[1], gpB[i-1].shape[0]) GE = cv2.pyrUp(gpB[i], dstsize = size) L = cv2.subtract(gpB[i-1], GE) lpB.append(L) LS = [] for la,lb in zip(lpA, lpB): rows, cols, dpt = la.shape ls = np.hstack((la[:,0:cols/2], lb[:,cols/2:])) LS.append(ls) ls_ = LS[0] for i in xrange(1,6): size = (LS[i].shape[1], LS[i].shape[0]) ls_ = cv2.pyrUp(ls_, dstsize = size) ls_ = cv2.add(ls_, LS[i]) real = np.hstack((A[:,:cols/2],B[:,cols/2:])) cv2.imwrite('Pyramid_blending2.jpg',ls_) cv2.imwrite('Direct_blending.jpg',real)
追å è³æ
-
è¼ã£ã¦ãã³ã¼ãã®éãåããããã¨ã©ã¼ãåºããã©ï¼stackoverflow ã§å¯¾å¦æ³è¦ã¤ãã
python - opencv error:Sizes of input arguments do not match - Stack Overflow