Ios Swift代码中的抗锯齿像素由OpenCV转换为不需要的黑色像素

Ios Swift代码中的抗锯齿像素由OpenCV转换为不需要的黑色像素,ios,swift,opencv,image-processing,antialiasing,Ios,Swift,Opencv,Image Processing,Antialiasing,我试图通过使用swift代码将抗锯齿设置为真,并将路径像素移除为透明,从而使一些像素透明。为了进一步的过程,我用C++将UIIMAGE发送到OpenCV,将路径的边缘转换为黑色像素。 我想删除不需要的黑色像素。如何删除opencv生成的黑色像素 在opencv中,仅将图像转换为mat以及从mat转换为UIImage,同样的问题也会发生 swift代码: guard let imageSize=image.size else{ return }

我试图通过使用swift代码将抗锯齿设置为真,并将路径像素移除为透明,从而使一些像素透明。为了进一步的过程,我用C++将UIIMAGE发送到OpenCV,将路径的边缘转换为黑色像素。 我想删除不需要的黑色像素。如何删除opencv生成的黑色像素

在opencv中,仅将图像转换为mat以及从mat转换为UIImage,同样的问题也会发生

swift代码:

guard let imageSize=image.size else{
            return
        }
        UIGraphicsBeginImageContextWithOptions(imageSize,false,1.0)
        guard let context = UIGraphicsGetCurrentContext() else{
            return
        }
        context.setShouldAntialias(true)
        context.setAllowsAntialiasing(true)
        context.setShouldSubpixelQuantizeFonts(true)
        context.interpolationQuality = .high
        imgCanvas.image?.draw(in: CGRect(x: 0, y:0, width: (imgCanvas.image?.size.width)!, height: (imgCanvas.image?.size.height)!))
        bezeirPath = UIBezierPath()
        bezeirPath.move(to: fromPoint)
        bezeirPath.addLine(to: toPoint)
        bezeirPath.lineWidth=(CGFloat(widthOfLine) * scaleX )/scrollView.zoomScale
        bezeirPath.lineCapStyle = CGLineCap.round
        bezeirPath.lineJoinStyle=CGLineJoin.round
        bezeirPath.flatness=0.0
        bezeirPath.miterLimit=0.0
        bezeirPath.usesEvenOddFillRule=true
        UIColor.white.setStroke()
        bezeirPath.stroke(with: .clear, alpha:0)
        bezeirPath.close()
        bezeirPath.fill()
        UIColor.clear.set()
        context.addPath(bezeirPath.cgPath)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
opencv代码:

Mat source;
    UIImageToMat(originalImage,source,true);

    return MatToUIImage(source);
我尝试了各种方法来解决这个问题,寻找不同的来源,但都没有奏效。在过去的三天里,我一直在努力解决这个问题。所以,如果有人对这个问题有任何线索的话,那会很有帮助的!
[

OpenCV可以帮助您使用Canny边缘检测器查找边缘。您可以在本链接中参考实现

C语言中OpenCV的Canny边缘检测++


此外,我希望您在实际提问之前先自己做一些研究。

我会将RGB图像和a遮罩作为单独的图像提供给OpenCV。将遮罩绘制成单通道图像:

guard let imageSize=image.size else{
        return
    }
    UIGraphicsBeginImageContextWithOptions(imageSize,false,1.0)
    guard let context = UIGraphicsGetCurrentContext() else{
        return
    }
    context.setShouldAntialias(true)
    context.setAllowsAntialiasing(true)
    context.setShouldSubpixelQuantizeFonts(true)
    context.interpolationQuality = .high
    context.setFillColor(UIColor.black.cgColor)
    context.addRect(CGRect(x: 0, y: 0, width: imageSize.width, height: imageSize.height))
    context.drawPath(using: .fill)
    bezeirPath = UIBezierPath()
    bezeirPath.move(to: fromPoint)
    bezeirPath.addLine(to: toPoint)
    bezeirPath.lineWidth=(CGFloat(widthOfLine) * scaleX )/scrollView.zoomScale
    bezeirPath.lineCapStyle = CGLineCap.round
    bezeirPath.lineJoinStyle=CGLineJoin.round
    bezeirPath.flatness=0.0
    bezeirPath.miterLimit=0.0
    bezeirPath.usesEvenOddFillRule=true
    UIColor.white.setStroke()
    bezeirPath.stroke()
    bezeirPath.close()
    bezeirPath.fill()
    let maskImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
然后在OpenCV中,可以将A图像应用于RGB图像

Mat source, sourceMask
UIImageToMat(image, source, true)
UIImageToMat(maskImage, sourceMask, true)
如果图像不是RGB,则可以将其转换为:

cvtColor(source, source, CV_RGBA2RGB)
cvtColor(sourceMask, sourceMask, CV_RGBA2GRAY)
如果遮罩不是单通道,则可以将其转换为:

cvtColor(source, source, CV_RGBA2RGB)
cvtColor(sourceMask, sourceMask, CV_RGBA2GRAY)
然后将RGB图像分割为多个通道:

Mat rgb[3];
split(source, rgb);
然后使用RGB通道和alpha通道创建RGBA图像:

Mat imgBGRA;

vector<Mat> channels = {rgb[0], rgb[1], rgb[2], sourceMask};
merge(channels, imgBGRA);
matimgbgra;
向量通道={rgb[0],rgb[1],rgb[2],sourceMask};
合并(通道、imgBGRA);

由于您的蒙版是使用抗锯齿创建的,因此上面创建的图像也将使用抗锯齿alpha。

您能展示一下它在做什么,以及您希望它看起来如何吗?透明像素边缘有黑色像素,需要透明。您在OpenCV中对图像做了什么?您能展示一个最终图像的示例吗你正在尝试创建?我已经通过设置反走样为真使像素在swift中透明,并将该图像发送到opencv进行进一步处理,但刚才我已将图像转换为mat,并将mat返回到uiimage并显示,然后显示上面的图像结果,opencv的代码在上面……如果反走样为假,则不会出现问题,但需要解决平滑锐利的像素我需要做真实的抗锯齿…我理解。但是一旦你在OpenCV中有了图像,你要用它做什么?最终产品是什么?不,但没有理由不工作。我几乎为你写了所有这些-你不需要太多来测试它。你正在使用cv的函数。函数像python和python没有分号endedI不知道你是否在OpenCV代码中使用objective-c。不确定你的名称空间是如何配置的。应该不难理解,但我会删除它。我已经分割了源通道并添加到灰度图像中,但这并没有解决问题。我建议的方法是不根本不改变RGB内容。黑/白只会被绘制到Alpha通道-因此它几乎不可能将RGB像素改变为黑色。