title: Python OpenCV detect a white object from a binary image and crop it
body: <p>My goal is detecting a piece of white paper from this binary image and then crop this white paper and make a new subset binary image just for this white paper. 
  <img src="https://i.stack.imgur.com/D1bZW.jpg" alt="enter image description here"></p>
  
  <p>Now my Python code with OpenCV can find this white paper. For the first step, I created a mask for finding this white paper:
  <img src="https://i.stack.imgur.com/eSw2d.png" alt="enter image description here"></p>
  
  <p>As you guys can see, the small white noise and small piece have been removed. And then the problem become how I can crop this white paper object from this binary image for making a new subset binary image?</p>
  
  <p>My current code is:</p>
  
  <pre><code>import cv2
  import numpy as np
  
  QR = cv2.imread('IMG_0352.TIF', 0) 
  mask = np.zeros(QR.shape,np.uint8) 
  
  contours, hierarchy = cv2.findContours(QR,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
  
  for cnt in contours:
      if cv2.contourArea(cnt)&gt;1000000:
          cv2.drawContours(mask,[cnt],0,255,-1) 
  </code></pre>
  
  <p>Looking for the cnt var, there are four elements, but they are nonsense to me. 
  I used code to fit a box:</p>
  
  <pre><code>x,y,w,h = cv2.boundingRect(cnt)
  cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
  </code></pre>
  
  <p>The box information doesn't seem right.</p>
  
  <p>Thanks for any suggestions. </p>
  
  <p>Follow up:
  I have figured out this problem, which is very easy. The code is attached:</p>
  
  <pre><code>import cv2
  import numpy as np
  
  
  QR_orig = cv2.imread('CamR_IMG_0352.TIF', 0)
  QR = cv2.imread('IMG_0352.TIF', 0) # read the QR code binary image as grayscale image to make sure only one layer
  mask = np.zeros(QR.shape,np.uint8) # mask image the final image without small pieces
  
  # using findContours func to find the none-zero pieces
  contours, hierarchy = cv2.findContours(QR,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
  
  # draw the white paper and eliminate the small pieces (less than 1000000 px). This px count is the same as the QR code dectection
  for cnt in contours:
      if cv2.contourArea(cnt)&gt;1000000:
          cv2.drawContours(mask,[cnt],0,255,-1) # the [] around cnt and 3rd argument 0 mean only the particular contour is drawn
  
          # Build a ROI to crop the QR
          x,y,w,h = cv2.boundingRect(cnt)
          roi=mask[y:y+h,x:x+w]
          # crop the original QR based on the ROI
          QR_crop = QR_orig[y:y+h,x:x+w]
          # use cropped mask image (roi) to get rid of all small pieces
          QR_final = QR_crop * (roi/255)
  
  cv2.imwrite('QR_final.TIF', QR_final)
  </code></pre>