将图像中颜色的不同色调转换为一种颜色

时间:2016-04-06 16:00:45

标签: python image opencv image-processing rgb

如何将浅灰色背景颜色(其色调变化)转换为单一颜色,比如浅灰色?我希望嵌入在背景颜色上方的深灰色也是一种颜色。到目前为止,我所做的是为这两个区域分配两个最接近的颜色名称('lightgray'和'dimgray'),并最小化每个像素的r,g,b的平方差的总和,并从webcolors模块获得最接近的颜色

rd = (r_c - requested_color[0]) ** 2
gd = (g_c - requested_color[1]) ** 2
bd = (b_c - requested_color[2]) ** 2

原始图片:

enter image description here

从我的python代码生成的图像:

enter image description here

你可以看到,沿着边界,我无法像原始图像中看到的那样获得浅灰色。

1 个答案:

答案 0 :(得分:3)

您想要做的是称为阈值处理。

有关如何使用OpenCV和Python执行此操作的一般介绍,请访问:http://docs.opencv.org/3.1.0/d7/d4d/tutorial_py_thresholding.html#gsc.tab=0

我在那里调整了一些代码参数:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('image.png',0)
img = cv2.medianBlur(img,7)
ret,th1 = cv2.threshold(img,160,255,cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,31,5)
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,31,5)
titles = ['Original Image', 'Global Thresholding (v = 127)',
'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
for i in xrange(4):
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

正如您在结果图像中看到的那样,图像的问题在于背景强度的强烈变化。在不知道图像的来源的情况下,在尝试通过软件解决此问题之前,我将从以下两个选项之一开始:

1。)获得更均匀的照明

2。)如果不可能,并且如果所有图像的照度相同,则仅制作背景的空图像并从其他图像中减去它,以获得更均匀的照明。

重要的是要了解这不是软件问题:在边框区域,背景比图像中间附近位置的结构更暗。您可以通过检查单个像素的灰度值来检查这一点。只有你的眼睛才能很好地弥补这一点。下面列出的自适应阈值技术试图找到适当的局部阈值,但这是有限的。但是,您可以找到更合适的参数,但我建议首先考虑的是照明的均匀性。

enter image description here

[编辑]

我在下面添加了一些额外的代码,用于播放允许您

的图像
  • 使用滑块调整阈值
  • 使用鼠标右键再次查看原始图像,检查 不同鼠标位置的灰度值,单击右侧 再次单击鼠标按钮,更改回阈值视图并使用灰度值 最后一个鼠标位置作为新的阈值。

import cv2
import numpy as np

mode = ""
Schwelle =0

def nothing(x):
    pass

def read_pixel(event,x,y,flags,param):
    global mode, Schwelle
    if event == cv2.EVENT_MOUSEMOVE:
        if mode == "Analyse":
            ix,iy = x,y
            font = cv2.FONT_HERSHEY_SIMPLEX
            img2=img.copy()
            cv2.putText(img2,str(ix)+" "+str(iy)+": "+str(img[y,x]),(50,50), font, 1,(255,255,255),2,cv2.LINE_AA)      
            cv2.imshow('image',img2)
    elif event == cv2.EVENT_RBUTTONDOWN:
        if mode == "Analyse":
            mode=""
            Schwelle=img[y,x]
            cv2.createTrackbar('Schwelle','image',Schwelle,255,nothing)            
        else:
            mode = "Analyse"
    elif event == cv2.EVENT_LBUTTONDOWN:
        Schwelle= img[y,x] 

img =cv2.imread('image.png',0)
cv2.namedWindow('image')
cv2.setMouseCallback('image',read_pixel)
cv2.createTrackbar('Schwelle','image',128,255,nothing)

while(1):
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break

    if mode != "Analyse":
        Schwelle = cv2.getTrackbarPos('Schwelle','image')
        ret,thresh1 = cv2.threshold(img,Schwelle,255,cv2.THRESH_BINARY)
        cv2.imshow('image',thresh1)

cv2.destroyAllWindows()
相关问题