jjzjj

安卓:自适应阈值

coder 2023-12-09 原文

我正在尝试通过 Derek Bradley 实现自适应阈值算法使用安卓系统。但它一直在返回黑色像素。这是我的代码 fragment 。请建议我应该怎么做。提前致谢。

public static Bitmap GrayscaleToBin(Bitmap bm2)
{

    Bitmap bm;
    bm=bm2.copy(Config.ARGB_8888, true);
    final   int width = bm.getWidth();
    final  int height = bm.getHeight();
    int[]  pixels;
    pixels = new int[width*height];
    bm.getPixels(pixels,0,width,0,0,width,height);     
    //Bradley AdaptiveThrsholdging       
    int []intImg= new int[width*height];
    int sum=0;
    for(int i=0;i<width;++i){
        sum=0;
        for(int j=0;j<height;++j)
        {
            sum=sum+pixels[i+j*width];
            if(i==0){intImg[i+j*width]=sum;}
            else
            {
                intImg[i+j*width]= intImg[i-1+j*width]+sum;
            }
        }
    }
    int x1,x2,y1,y2=0,count=0;
    int s=width >> 3;   
    int t=15;
    for(int i=0;i<width;++i)
    {
        for(int j=0;j<height;++j)
        {
            x1=i-s/2;
            x2=i+s/2;
            y1=j-s/2;
            y2=j+s/2;
            if (x1 <0) x1 = 0;  
            if (x2>= width) x2 = width-1;  
            if (y1 <0) y1 = 0;  
            if (y2>= height) y2 = height-1;  
            count = (x2-x1) * (y2-y1);  
            sum = intImg [y2 * width + x2] -  
            intImg [y1 * width + x2] -  
            intImg [y2 * width + x1] +  
            intImg [y1 * width + x1]; 
            if((pixels[i+j*width]*count)<=(sum*(100-t)/100))
            {
                pixels[i+j*width]=0;
            }
            else
            {
                pixels[i+j*width]=255; 
            }
        }
    }
    /*---------------------------------------------------------------------------*/
    bm.setPixels(pixels,0,width,0,0,width,height);
    // Log.d("cdsfss","afterloop");
    return bm;
}

最佳答案

经过长时间的斗争,我用下面的代码解决了这个问题。

public static Bitmap GrayscaleToBin(Bitmap bm2)
 {
 Bitmap bm;
 bm=bm2.copy(Config.RGB_565, true);
 final   int width = bm.getWidth();
 final  int height = bm.getHeight();

 int pixel1,pixel2,pixel3,pixel4,A,R;
 int[]  pixels;
 pixels = new int[width*height];
 bm.getPixels(pixels,0,width,0,0,width,height);
 int size=width*height;
      int s=width/8;
      int s2=s>>1;
      double t=0.15;
      double it=1.0-t;
      int []integral= new int[size];
      int []threshold=new int[size];
      int i,j,diff,x1,y1,x2,y2,ind1,ind2,ind3;
      int sum=0;
      int ind=0;
      while(ind<size)
      {
       sum+=pixels[ind] & 0xFF;
       integral[ind]=sum;
       ind+=width;
      }
   x1=0;
   for(i=1;i<width;++i)       
   {
       sum=0;
       ind=i;
       ind3=ind-s2;
       if(i>s)
       {
           x1=i-s;
       }
       diff=i-x1;
       for(j=0;j<height;++j)
       {
           sum+=pixels[ind] & 0xFF;
           integral[ind]=integral[(int)(ind-1)]+sum;
           ind+=width;
           if(i<s2)continue;
           if(j<s2)continue;
           y1=(j<s ? 0 : j-s);
           ind1=y1*width;
           ind2=j*width;

        if (((pixels[ind3]&0xFF)*(diff * (j - y1))) < ((integral[(int)(ind2 + i)] - integral[(int)(ind1 + i)] - integral[(int)(ind2 + x1)] + integral[(int)(ind1 + x1)])*it)) {
            threshold[ind3] = 0x00;
        } else {
            threshold[ind3] = 0xFFFFFF;
        }
        ind3 += width;
    }
}

y1 = 0;
for( j = 0; j < height; ++j )
{
    i = 0;
    y2 =height- 1;
    if( j <height- s2 ) 
    {
        i = width - s2;
        y2 = j + s2;
    }

    ind = j * width + i;
    if( j > s2 ) y1 = j - s2;
    ind1 = y1 * width;
    ind2 = y2 * width;
    diff = y2 - y1;
    for( ; i < width; ++i, ++ind )
    {

        x1 = ( i < s2 ? 0 : i - s2);
        x2 = i + s2;

        // check the border
        if (x2 >= width) x2 = width - 1;

        if (((pixels[ind]&0xFF)*((x2 - x1) * diff)) < ((integral[(int)(ind2 + x2)] - integral[(int)(ind1 + x2)] - integral[(int)(ind2 + x1)] + integral[(int)(ind1 + x1)])*it)) {
            threshold[ind] = 0x00;
        } else {
            threshold[ind] = 0xFFFFFF;
        }
    }
}
   /*-------------------------------
    * --------------------------------------------*/
   bm.setPixels(threshold,0,width,0,0,width,height);

   return bm;
}

关于安卓:自适应阈值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14758572/

有关安卓:自适应阈值的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. (一)专题介绍:移动端安卓手机改造成linux服务器&linux服务器中安装软件、部署前后端分离项目实战 - 2

    快捷目录前言一、涉及到的相关技术简介二、具体实现过程及踩坑杂谈1.安卓手机改造成linux系统实现方案2.改造后的手机Linux中软件的安装3.手机Linux中安装MySQL5.7踩坑实录4.手机Linux中安装软件的正确方法三、Linux服务器部署前后端分离项目流程1.前提准备(安装必要软件,搭建环境):2.前后端分离项目的详细部署过程:总结前言总体概述:本篇文章隶属于“手机改造服务器部署前后端分离项目”系列专栏,该专栏将分多个板块,每个板块独立成篇来详细记录:手机(安卓)改造成个人服务器(Linux)、Linux中安装软件、配置开发环境、部署JAVA+VUE+MySQL5.7前后端分离项目

  3. ruby-on-rails - 为什么我需要更加努力地使我的 Rails 应用程序适应 RESTful 架构? - 2

    我最近开始了一个Rails项目,并决定使用RESTfulController。我为我的关键实体(例如国家/地区)创建了Controller并添加了index、new、edit、create、显示、更新和删除。我将我的map.resources:country添加到我的路线文件中,生活很美好。开发稍有进展后,就开始遇到问题了。我有时需要在我的Controller中执行额外的操作。首先是search操作,它返回我喜欢的自动完成搜索框的选项。然后需要在应用程序的不同位置以两种不同的方式显示国家/地区(显示的数据也不同,所以它不仅仅是两个View)-我添加了index_full操作。然后我想在

  4. javascript - 如何适应 gridPanels 列? - 2

    我有使用ExtJs3.4的应用程序。我有这个结构:westPanel-TabPanel:varwestPanel=newExt.TabPanel({id:"west",//xtype:"tabpanel",//layout:'fit',activeTab:0,region:"west",border:false,width:278,split:true,collapseMode:"mini",items:[mapList,structure,cadastr,search]});搜索-表单面板:varsearch=newExt.FormPanel({labelAlign:'top',fr

  5. javascript - 如何在 plotly js 中创建水平阈值线? - 2

    我正在使用plotlyJS创建一个简单的折线图。代码如下:vartrace1={x:[1,2,3,4],y:[10,15,13,17],type:'scatter'};varlayout={xaxis:{title:"X-Axis",tickangle:45,rangemode:'nonnegative',autorange:true,exponentformat:"none"},yaxis:{title:"Time",tickangle:45,rangemode:'nonnegative',autorange:false}}Plotly.newPlot(myDiv,[trace1],

  6. javascript - 如何更改 Bootstrap 内联日期选择器以适应全宽 - 2

    我在这里使用Bootstrap日期选择器:https://github.com/eternicode/bootstrap-datepicker现在我想用父容器调整它的宽度,但目前它只填充一个固定大小,我不知道在哪里可以通过CSS更改它。也许您之前遇到过类似的问题并愿意帮助我?我附上了问题的图片:http://i.stack.imgur.com/ShZTU.png下面是通过JavaScript添加日期选择器功能之前的代码:';RobertJangemail@example.com然后我使用这段JavaScript代码添加日期选择器功能:jQuery('#bs-datepicker-inl

  7. javascript - 使用 CSS 转换或 javascript 缩放元素以动态适应其父元素 - 2

    我有一个页面,其中有一个的轮子元素,当您单击一个按钮时,整个轮子都会旋转。我通过使用本质上绝对的CSS转换来实现这种效果。然而,轮子很大,在我的高清显示器上看起来不错,但较小的屏幕会切掉边缘。我不能像在普通布局中那样使用%宽度,我需要的是像大多数浏览器缩放功能一样缩小整个页面。就我自己而言,我知道ctr+mouseWheel会缩小页面以便我可以看到整个页面,但是我不能指望其他人这样做。我知道我可以使用-browser-transform:scale(amt);在包装div上获得我想要的效果,但是我想不出一种动态的方法。如果我将比例设置为0.5,无论屏幕如何,它都会是0.5。我希望轮子的

  8. javascript - 确保调整任何内容的大小以适应固定的 div - 2

    好的,问题来了:我有一个div,它设置为几乎整个屏幕大小(在移动设备上),内容将放置在其中,但内容本身不受我的直接控制。图像或内部链接上不会有内联样式。我需要确保:1-div中的所有内容都可见,如果有很长的行,它们将被迫换行,或者干脆被chop。2-图片应保持其纵横比,但调整大小以保持在div的范围内。3-内容应该“填满”空间,根据需要变大或变小。最后一个好处:内容中最多只能有一张图片,但可以有多个链接。我在这里找到了一些其他的答案,但没有一个能满足这个特殊的挑战。jQuery是一个选项,但我发现它在移动设备上运行缓慢,jQueryMobile是一个选项,但同样的基本问题。以最有效的方

  9. javascript - jquery调整窗口大小以适应内容 - 2

    我有一个显示300x300px图片的简单弹出窗口,我将窗口的大小设置为350x350px,但根据浏览器的不同,我会得到滚动条或额外的空白。是否有一些jQuery函数可以调整浏览器窗口的大小以适应内容而没有任何滚动条或空白,无论是什么浏览器?帮帮我!! 最佳答案 你可以做这样的事情..functionwindowResize(){varcontentWidth=document.getElementById("YourImageOrContent").offsetWidth;varcontentHeight=document.getE

  10. 微信小程序安卓视频播放卡顿问题 - 2

    在微信小程序开发中遇到在video组件的两个问题1.安卓手机里播放视频会有明显的卡顿问题刚开始以为是网络问题,或者是视频文件问题。排查了一下发现都没问题最后加了个属性就OK了uniapp和原生小程序方法:custom-cache="false"custom-cache={{false}}video组件兼容iOS手机custom-cache加了这个属性会让2.iOS手机第一次播放视频会有几秒黑屏问题因此我加了当前手机型号的判断uni.getDeviceInfo().deviceType获取当前设备api当为iPhone时不加custom-cache属性,否则加上custom-cache=“fal

随机推荐