简体   繁体   中英

How to replace color of image using opencv?

I'm trying to replace different colors in image using opencv.

Image is as below

I'm trying to replace border color and main object color which is shade of yellow into some other random different color say orange and red, first I tried to change border color as in below code

image = cv.imread(r'image.png')
hsv=cv.cvtColor(image,cv.COLOR_BGR2HSV)
yellow_lo=np.array([0,0,240])
yellow_hi=np.array([179,255,255])
mask=cv.inRange(hsv,yellow_lo,yellow_hi)

I get mask image as below

as you can see there's a gap between the lines in the border color , when I replace the color for this mask image I still can see the original color present in the image as below, line is not continously red in color

image[mask>0]=(0,0,255)

this is happening because pixel intensity of border varies its not constant as shown in below zoomed image

How can I solve this and replace the color of total border? I tried to erode and dilate mask image to complete broken line it didn't fix the issue. Any help suggestion to fix this will be highly appreciated.

To replace the border you need a prominent mask. A mask that strongly represents the border.

Analyzing the third channel in HSV color space (value) gives the following:

在此处输入图像描述

Applying an appropriate threshold on this channel gives a well defined mask, which can later be used to replace the color:

mask = cv2.threshold(hsv[:,:,2], 150, 255, cv2.THRESH_BINARY)[1]
img[th==255]=(0,0,255)

在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM