Andries
Andries

Reputation: 11

ROI is written in lighter colors than original picture

I'm trying to locate an object (here a PWB) on a picture. First I do this by finding the largest contour. Then I want to rewrite solely this object into a new picture so that in the future I can work on smaller pictures. The problem however is that when I rewrite this ROI, the picture gets of a lighter color than the original one.

CODE:

Original = cv2.imread(picture_location)
image = cv2.imread(mask_location)
img = cv2.medianBlur(image,29)
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
dst = cv2.bitwise_and(Original, image)
roi = cv2.add(dst, Original)
ret,thresh = cv2.threshold(imgray,127,255,0)
im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
area = 0
max_x = 0
max_y = 0
min_x = Original.shape[1]
min_y = Original.shape[0]
for i in contours:
    new_area = cv2.contourArea(i)
    if new_area > area:
        area = new_area
        cnt = i
x,y,w,h = cv2.boundingRect(cnt)
min_x = min(x, min_x)
min_y = min(y, min_y)
max_x = max(x+w, max_x)
max_y = max(y+h, max_y)
roi = roi[min_y-10:max_y+10, min_x-10:max_x+10]
Original = cv2.rectangle(Original,(x-10,y-10),(x+w+10,y+h+10),(0,255,0),2)

#Writing down the images
cv2.imwrite('Pictures/PCB1/LocatedPCB.jpg', roi)
cv2.imwrite('Pictures/PCB1/LocatedPCBContour.jpg',Original)

Since I don't have 10 reputation yet I cannot post the pictures. I can however provide the links:

Original http://imgur.com/a/UY736 Region of Interest http://imgur.com/a/UY736

The main question is how do I get the software to write down the ROI in the exact same colour as the original picture? I'm a elektromechanical engineer however, so I'm fairly new to this, remarks on the way I wrote my code would also be appreciated if possible.

Upvotes: 1

Views: 115

Answers (2)

Jeru Luke
Jeru Luke

Reputation: 21223

You can perhaps perform an edge detection after blurring your image.

How to select best parameters for Canny edge? SEE HERE

lower = 46
upper = 93
edged = cv2.Canny(img, lower, upper) #--- Perform canny edge on the blurred image

kernel = np.ones((5,5),np.uint8)
dilate = cv2.morphologyEx(edged, cv2.MORPH_DILATE, kernel, 3) #---Morphological dilation

_, contours , _= cv2.findContours(dilate, cv2.RETR_EXTERNAL, 1) #---Finds all parent contours, does not find child contours(i.e; does not consider contours within another contour)

max = 0
cc = 0
for i in range(len(contours)):   #---For loop for finding contour with maximum area
    if (cv2.contourArea(contours[i]) > max):
        max = cv2.contourArea(contours[i])
        cc = i

cv2.drawContours(img, contours[cc], -1, (0,255,0), 2) #---Draw contour having the maximum area
cv2.imshow(Contour of PCB.',img)

enter image description here

x,y,w,h = cv2.boundingRect(cnt[cc])   #---Calibrates a straight rectangle for the contour of max. area

enter image description here

crop_img = img1[y:y+h, x:x+w] #--- Cropping the ROI having the coordinates of the bounding rectangle
cv2.imshow('cropped PCB.jpg',crop_img)

enter image description here

Upvotes: 1

Quang Hoang
Quang Hoang

Reputation: 150785

The problem is that you first let roi = cv2.add(dst, Original) and finally cut from the lighten picture in here:

roi = roi[min_y-10:max_y+10, min_x-10:max_x+10]

If you want to crop the original image, you should do:

roi = Original[min_y-10:max_y+10, min_x-10:max_x+10]

Upvotes: 2

Related Questions