Algorithm 什么';有什么好的算法可以使图像上的文字变得突出?

Algorithm 什么';有什么好的算法可以使图像上的文字变得突出?,algorithm,text,graphics,colors,Algorithm,Text,Graphics,Colors,例如,在图像下方,一张照片是背景,照片中心有一个字符“Iniesta”。 但是由于颜色不好,这个字符很难辨认。 有没有什么好的算法来获得颜色,使图像上的字符突出 您可以使用以下技巧,而不是制作矩形背景(看起来确实不太好看): 选择两种对比色(例如白色和黑色) 使用第一种颜色和宽笔(例如5像素)划出文本 绘制使用第二种颜色填充的文本 如果您不能用宽笔划过文本,另一种方法是用小偏移量多次绘制文本;e、 g.(Python) 例如,一个像素的边框看起来像这样。。。 对于静态和动态场景,有许多不同的

例如,在图像下方,一张照片是背景,照片中心有一个字符“Iniesta”。 但是由于颜色不好,这个字符很难辨认。 有没有什么好的算法来获得颜色,使图像上的字符突出


您可以使用以下技巧,而不是制作矩形背景(看起来确实不太好看):

  • 选择两种对比色(例如白色和黑色)
  • 使用第一种颜色和宽笔(例如5像素)划出文本
  • 绘制使用第二种颜色填充的文本
如果您不能用宽笔划过文本,另一种方法是用小偏移量多次绘制文本;e、 g.(Python)

例如,一个像素的边框看起来像这样。。。
对于静态和动态场景,有许多不同的方法。我假设是静态图像,所以我专注于此。以下是一些基本方法:

  • 纸张区域

    使用纸张颜色清除文本后面的空间,并使用墨水颜色渲染文本,正如您所提到的,这对于复杂图像来说并不酷

  • 笔划、阴影、3D

    使用2种颜色渲染文本。内有文字颜色和笔划与之形成对比的颜色。如果您没有该功能,则可以先在笔划颜色中渲染字体/粗体较大的字符,然后用内部颜色的较小字体大小覆盖
    +/-
    将位置移动到字体中心。移位方法确定渲染笔划、阴影甚至3D文本是否可以像这样实现

  • 透明度

    不是通过恒定颜色渲染文本像素,而是向原始像素颜色添加一些颜色值。您也可以使用减色或使用alpha混合代替

  • 异或

    而是使用颜色
    XOR
    渲染像素,使用其他颜色或白色渲染原始颜色

  • 这就是它的样子:

    这里是VCL/C++中的源代码:

    void TMain::draw()
    {
    如果(!\u重画)返回;
    //所需变量
    AnsiString txt,a;
    t颜色c0=CL黑色,c1=CL白色;
    int tx=50,ty=50,tys=30,dty=tys*1.5;
    int x,y,x0,x1,y0,y1,i,b;
    //清晰的整体图像
    bmp->画布->画笔->颜色=黑色;
    bmp->Canvas->FillRect(TRect(0,0,xs,ys));
    //复印照片
    bmp->画布->绘制(0,0,英寸);
    //呈现文本。。。
    txt=“纸张区域”;
    bmp->Canvas->Font->Size=tys;
    bmp->Canvas->Font->Color=c1;
    bmp->画布->画笔->颜色=c0;
    bmp->Canvas->Brush->Style=bsSolid;
    bmp->Canvas->TextOutA(tx,ty,txt);ty+=dty;
    txt=“笔划”;
    bmp->Canvas->Brush->Style=bsClear;
    对于(x=tx,y=ty,i=1;iCanvas->Font->Size=tys+3;
    bmp->Canvas->Font->Color=c0;
    bmp->Canvas->Font->Style=TFontStyles()文本宽度(a);
    y0=bmp->画布->文本高度(a);
    bmp->Canvas->TextOutA(x,y,a);
    //内焦
    bmp->Canvas->Font->Size=tys;
    bmp->Canvas->Font->Color=c1;
    bmp->Canvas->Font->Style=TFontStyles();
    x1=bmp->Canvas->TextWidth(a);
    y1=bmp->Canvas->TextHeight(a);
    bmp->Canvas->TextOutA(x+((x0-x1)>>1),y+((y0-y1)>>1),a);
    //下一个字符位置
    x+=x0;
    }ty+=dty;
    txt=“阴影/3D文本”;
    bmp->Canvas->Brush->Style=bsClear;
    bmp->Canvas->Font->Size=tys;
    bmp->Canvas->Font->Color=c0;
    对于(i=0;iCanvas->TextOutA(tx-i,ty+i,txt);
    bmp->Canvas->Font->Color=c1;
    bmp->Canvas->TextOutA(tx,ty,txt);ty+=dty;
    图形::TBitmap*tmp=新图形::TBitmap;
    tmp->PixelFormat=PF32位;
    tmp->HandleType=bmDIB;
    txt=“透明”;
    tmp->Canvas->Brush->Style=bsSolid;
    tmp->画布->画笔->颜色=0x00000000;//最大黑色
    tmp->Canvas->Font->Size=tys;
    tmp->画布->字体->颜色=0x00808080;//颜色偏移
    x=bmp->画布->文本宽度(txt);
    y=bmp->画布->文本高度(txt);
    tmp->SetSize(x,y);
    tmp->Canvas->FillRect(TRect(0,0,x,y));
    tmp->Canvas->TextOutA(0,0,txt);
    联合列{dworddd;字节db[4];}*p0,*p1;
    对于(y0=0,y1=ty;y0扫描线[y0];
    p1=(列*)bmp->扫描线[y1];
    对于(x0=0,x1=tx;x0Canvas->Brush->Style=bsSolid;
    tmp->画布->画笔->颜色=0x00000000;//最大黑色
    tmp->Canvas->Font->Size=tys;
    tmp->画布->字体->颜色=0x00FFFFFF;//最大白色
    x0=bmp->Canvas->TextWidth(txt);
    y0=bmp->画布->文本高度(txt);
    tmp->SetSize(x0,y0);
    tmp->Canvas->FillRect(TRect(0,0,x0,y0));
    tmp->Canvas->TextOutA(0,0,txt);
    bmp->Canvas->CopyMode=cmsrc反转;
    bmp->Canvas->Draw(tx,ty,tmp);ty+=dty;
    bmp->Canvas->CopyMode=cmsrcopy;
    删除tmp;
    //渲染backbuffer
    主->画布->绘制(0,0,bmp);
    _重画=假;
    }
    
    它只使用了VCL封装的GDI内容,因此应该足够清晰


    bmp
    是backbuffer图像
    中的
    是您的图像
    

    tmp
    是用于自定义组合文本和图像的临时图像

    还有一个想法:在文本区域周围选择一个框,或者如果整个图像的颜色相对均匀,则选择整个图像。现在通过将颜色值相加并除以像素数来计算该区域的平均颜色

    现在选择一种与此平均颜色对比度良好的颜色。例如,您可以使用简单的公式
    (255-r,255-g,255-b)
    来获得对比度颜色。但是,如果平均颜色接近128灰色,则此操作将失败,因此您需要对此进行特殊处理


    另一种方法是将平均颜色转换为,然后使用色调;例如,只需向其添加180,和/或反转“亮度”(值/亮度)。同样,您需要对灰度(饱和度接近0)情况进行特殊处理。

    最简单的方法是对文本使用两种不同的颜色-一种作为背景色,等等
    for dy in range(-3, 4):
        for dx in range(-3, 4):
            draw_text(color1, x+dx, y+dy, message)
    draw_text(color2, x, y, message)