簡體   English   中英

如何基於邊緣檢測重新着色圖像(canny)

[英]How to recolor image based on edge detection(canny)

我有一個腳本,用於根據顏色相似性重新着色房間牆壁。 但我需要根據邊緣檢測重新着色牆壁。

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

文件路徑 --> 圖像

celor --> 顏色,你想重新着色

lower_color --> RGB 的較低值

upper_color --> RGB 的上限值

原始圖像

基於顏色相似度的重新着色圖像

我正在使用 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()

結果:

輸出圖像

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM