gpt4 book ai didi

python - 如何基于边缘检测对图像重新着色(Canny)

转载 作者:行者123 更新时间:2023-12-02 17:19:24 25 4
gpt4 key购买 nike

我有一个脚本,该脚本用于根据颜色相似性为房间的墙壁重新着色。但是我需要根据边缘检测为墙壁重新着色。

import cv2
import numpy as np
import sys
from PIL import Image
import numpy as np
from hex_to_rgb import color

def recolor(file_path, celor, lower_color, upper_color):

img = cv2.imread(file_path)
res = img.copy()
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

r2, g2, b2 = color(celor)

mask = cv2.inRange(rgb, lower_color, upper_color)

mask = mask/255
mask = mask.astype(np.bool)
res[:,:,:3][mask] = [b2, g2, r2] # opencv uses BGR
im_rgb = cv2.cvtColor(res, cv2.COLOR_BGR2RGB)
return im_rgb
file_path->图片
celor->颜色,您要重新着色
lower_color->较低的RGB值
upper_color-> RGB的上限值
Original Image
Recolored Image based on color similarity

最佳答案

我正在使用Sobel边缘检测来解决此问题。我也尝试使用Canny边缘检测,但是效果不佳。
边缘检测后,我将阈值应用于图像并在图像中找到轮廓。这里的问题是,在这种情况下,我正在使用最大的区域着色轮廓。您将必须找出一种方法来选择要着色的轮廓。

img = cv2.imread("colourWall.jpg")
cImg = img.copy()
img = cv2.blur(img, (5, 5))
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

scale = 1
delta = 0
ddepth = cv.CV_16S

grad_x = cv.Sobel(gray, ddepth, 1, 0, ksize=3, scale=scale, delta=delta, borderType=cv.BORDER_DEFAULT)
grad_y = cv.Sobel(gray, ddepth, 0, 1, ksize=3, scale=scale, delta=delta, borderType=cv.BORDER_DEFAULT)

abs_grad_x = cv.convertScaleAbs(grad_x)
abs_grad_y = cv.convertScaleAbs(grad_y)

grad = cv.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)

ret, thresh = cv2.threshold(grad, 10, 255, cv2.THRESH_BINARY_INV)

c, h = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

areas = [cv2.contourArea(c1) for c1 in c]
maxAreaIndex = areas.index(max(areas))

cv2.drawContours(cImg, c, maxAreaIndex, (255, 0, 0), -1)

plt.imshow(cImg)
plt.show()
结果:
outputImage

关于python - 如何基于边缘检测对图像重新着色(Canny),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62936103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com