如何将浅灰色背景颜色(其色调变化)转换为单一颜色,比如浅灰色?我希望嵌入在背景颜色上方的深灰色也是一种颜色。到目前为止,我所做的是为这两个区域分配两个最接近的颜色名称('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
原始图片:
从我的python代码生成的图像:
你可以看到,沿着边界,我无法像原始图像中看到的那样获得浅灰色。
答案 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。)如果不可能,并且如果所有图像的照度相同,则仅制作背景的空图像并从其他图像中减去它,以获得更均匀的照明。
重要的是要了解这不是软件问题:在边框区域,背景比图像中间附近位置的结构更暗。您可以通过检查单个像素的灰度值来检查这一点。只有你的眼睛才能很好地弥补这一点。下面列出的自适应阈值技术试图找到适当的局部阈值,但这是有限的。但是,您可以找到更合适的参数,但我建议首先考虑的是照明的均匀性。
[编辑]
我在下面添加了一些额外的代码,用于播放允许您
的图像
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()