How to merge two images in openCv(python)?

Question:

I extracted Red channel at this image

and I created a rectangle for this image

I want to blending as merge this two images and withoutRedChannel is should be positioned inside the rectangle

it is for extract red channel:

 withoutRedChannel=Pozisyonlama[:,:,2]

it is for rectangle:

    img_rect = cv2.rectangle(image, pt1, pt2, recColor, thickness, lineType)   
   
    frame = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    image = QImage(frame, frame.shape[1],frame.shape[0],frame.strides[0],QImage.Format_RGB888)
    

my function’s full code here:

  def setRectangleRedChannel(self,_image):
    lineType = cv2.LINE_4
    
    pt1 = (0,45)
    pt2 = (320, 135)
    recColor = (200, 0, 0)
    thickness = 2
    
    x, y = pt1[0], pt1[1]
    w, h = pt2[0] - pt1[0], pt2[1] - pt1[1]
   
    
    image = cv2.resize(_image,(320,180))
    
    Pozisyonlama = image[y:y+h, x:x+w]
    
    
    
    
    
    withoutRedChannel=Pozisyonlama[:,:,2]
    
    cv2.imshow("",withoutRedChannel)
    
  
    
    #dst = cv2.addWeighted(image.img, 1, withoutRedChannel.img, 1, 0.0)

    
    
  
  
    
    
    
    
    
   
   
    
    
    img_rect = cv2.rectangle(image, pt1, pt2, recColor, thickness, lineType)   
   
    frame = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    image = QImage(frame, frame.shape[1],frame.shape[0],frame.strides[0],QImage.Format_RGB888)
    
    
    self.redChannel_image.setPixmap(QtGui.QPixmap.fromImage(image))
Asked By: Fatih ışılgan

||

Answers:

If you want to merge two images into one, you can do this:

img[y_min:y_max,x_min:x_max] = template

where img is your full image and template is the cropped image. Be sure that both images have the same channels.

If your template image is in gray scale, you have to do this before to merged with the full image:

h, w = template
templateColor = numpy.zeros((h,w,3),numpy.uint8)
for j in range(h):
    for i in range(w):
        templateColor [j,i,:] = template[j,i]

For your code, will be:

def setRectangleRedChannel(_image):
    lineType = cv2.LINE_4
    pt1 = (0,45)
    pt2 = (320, 135)
    recColor = (200, 0, 0)
    thickness = 2
    x, y = pt1[0], pt1[1]
    w, h = pt2[0] - pt1[0], pt2[1] - pt1[1]
    image = cv2.resize(_image,(320,180))
    withoutRedChannel = image[y:y+h, x:x+w,2]
    color = numpy.zeros((h,w,3),numpy.uint8)
    for j in range(h):
        for i in range(w):
            color[j,i,:] = withoutRedChannel[j,i]
    image[y:y+h, x:x+w] = color[:,:,:]
    cv2.imshow("",image)
Answered By: PepeChuy
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.