编程语言
首页 > 编程语言> > java-以编程方式使图像的背景透明或白色

java-以编程方式使图像的背景透明或白色

作者:互联网

如果创建的应用程序希望将图像的“背景”设置为透明或白色,那么有没有办法做到这一点?

例如 :

在图像http://upload.wikimedia.org/wikipedia/commons/b/b9/Bronze_Statuette_of_a_Veiled_and_Masked_Dancer_1.jpg中,我想以编程方式变换图像,以便仅保留雕像,而背景(即图像的其余部分)全为白色或透明.

同样,用户可能会指出图像中应“保留”的部分,其余部分应全部为白色或透明.

如何才能做到这一点?另外,如果有合适的Java库或一段代码,这将很有帮助.

问候

解决方法:

对于该特定图像,有几种方法可以解决部分问题.也许如果您结合了多种方法并为用户提供了交互式选择,那么您可以在相当短的时间内开发出一款出色的软件.我会用它!

您和Misha已经讨论了前两个项目:

>使用Canny或其他方式进行边缘检测.我建议您应该对“原始”边缘强度图像进行处理,而不是对边缘强度进行阈值化以生成二进制图像.请注意,在这种情况下,该图聚焦清晰,而大部分背景都没有聚焦.尽管这不是一个通用的解决方案,但对于此特定图像,您可以滤除(a)属于线的边缘(使用Hough或RANSAC),但(b)梯度低于阈值陡度的边缘.
>洪水填充. Misha已经提供了链接.泛洪填充“静态”值应该不会太难实现(例如,填充相对于所单击像素的所有相邻像素值N的像素).实施动态洪水填充可以很好地解决由于光照和3D曲率引起的渐变. . .哎哟!
>平均移位聚类.这甚至可以作为帮助将相同HSV值的像素聚集在一起的第一步.但是,仅关注图像,前景人物的色调和大多数背景的色调是相似的. OpenCV具有均值移位的实现.有关工作中的CAMSHIFT算法的视频:http://www.youtube.com/watch?v=iBOlbs8i7Og
>边缘跟随以获得强力边缘.如果用户单击接近一条边,则可以确定最接近的强边,然后使用轮廓跟随(或“轮廓跟踪”)算法.基本的轮廓跟踪算法适用于二进制图像;您可以调整算法以尝试遵循RGB空间中的优势.整rick
>因为您正在为用户编写软件,所以将您的一些时间用于软件的可用性,而不仅仅是尝试解决一般的图像处理问题.
>检查背景曲线是否遮挡.确定项目是否属于背景的另一种方法是确定项目是否被前景对象遮挡(隐藏).如果找到两个共线且具有缓和梯度的线段(即它们不在焦点上),则它们可能是两个线段而不是一个线段,因为它们被前景对象遮挡了.
>如果有机会可以使用照相机而不是现有图像,则可以通过在不同焦点设置下拍摄多个连续图像来模仿“光场”或全光照相机(例如Lytro https://www.lytro.com/camera).这可以帮助您根据渐变的变化来识别不同深度的图形.如果雕像相对靠近相机,当相机聚焦到无穷远时,它将失去聚焦.

改善可用性

>假设您可以将图像分割成相当不同的块,请提示用户单击属于相同兴趣对象的块.每个块都可以具有自己的一组调整参数,以用于边缘强度,颜色的可接受范围等.具有块特定的参数可以帮助使软件可用,即使存在阴影,光照变化等,也存在分割问题.可以通过组合选择在GIMP和Photoshop中完成类似的操作,但是它的可用性比以前要差.
>对于已识别的块,实施“从边缘捕捉”功能,该功能可帮助用户将发现的边缘曲线移动到真实的边缘曲线上.如果用户抓住一块轮廓并将其沿一个方向拖动,则轮廓可能会沿该方向捕捉到下一个坚固的边缘.
>提供批处理选项.如果用户在相同条件下拍摄了一系列照片,则用户为第一张图像选择的块可以帮助指导软件设置连续图像的参数.这并不是要解决一般的分割问题,而是可能为用户节省某些图像组的时间和精力.

这是一个有趣的问题.祝好运!

标签:image,image-processing,image-manipulation,java
来源: https://codeday.me/bug/20191101/1986572.html