我的图片看起来像这样:
我想弄清楚一些事情:
我是图像处理的新手,但我的攻击计划是:
width * height * % of white in alpha = area of tattoo ink
这是否是获得最终结果的合理方法?是否有一些我可能不知道的更容易/更可靠的东西,作为一个新手呢?
我使用skimage
对它运行了一些边缘分析代码,得到了这样的轮廓:
但我从这里遇到麻烦,用颜色填充轮廓以创建alpha。问题是我只想知道墨水的区域,而不是整个纹身的区域,所以这似乎更难填补轮廓
答案 0 :(得分:3)
我没有使用边缘检测和轮廓,而是建议以下approch -
1)将图像从RGB转换为灰度。
2)使用自适应threasholding将其转换为二进制图像(我在查看您上传的图像后建议这样做。)
3)现在只需计算像素数量,即可获得纹身区域和皮肤。
4)要计算主要颜色(我在这里只看到两个),你可以从二进制图像中找到与纹身和皮肤相对应的所有像素的平均值,或者你可以计算颜色直方图。
答案 1 :(得分:1)
另一种方法是通过k-means聚类执行颜色量化。提供的示例中显示的纹身只有一种颜色,因此量化图像应该有两种颜色,即墨水和皮肤。
import numpy as np
from skimage import io
from sklearn.cluster import KMeans
img = io.imread('https://i.stack.imgur.com/Upcb0.png')
n_colors = 2
X = img.reshape((-1, 3))
kmeans = KMeans(n_clusters=n_colors, random_state=0).fit(X)
labels = kmeans.labels_
centers = kmeans.cluster_centers_
quantized = centers[labels].reshape(img.shape).astype('uint8')
io.imshow(quantized)
主要颜色的RGB坐标为:
In [69]: centers
Out[69]:
array([[ 226.44193236, 193.24337359, 175.1311746 ],
[ 40.0549615 , 36.64523871, 40.75754915]])
假设墨水比皮肤更暗(即墨水颜色的欧几里德范数小于皮肤颜色),纹身所覆盖的图像像素的比例可以这样计算:
In [70]: darkest = np.argmin(np.sqrt(np.sum(centers**2, axis=1)))
In [71]: np.true_divide(np.sum(labels == darkest), labels.size)
Out[71]: 0.24738437499999999