关于widthStep造成的问题

关于widthStep造成的问题最近遇到一个很奇怪的问题,一直没有解决,就是在A图像中设置一个ROI,将其clone给B,然后对B进行二值化,输入为B,输出为C,这时二值化完后的图像C跟ROI区域的图像区域不同。通过查看发现罪魁祸首是widthStep变了。无意中解决了这个问题,做法如下:方法1:就是在A图像中设置一个ROI,将其clone给B,新建一个C,大小、位数和通道数同B,将Bclone给C,然后对C进行

大家好,又见面了,我是你们的朋友全栈君。

最近遇到一个很奇怪的问题,一直没有解决,就是在A图像中设置一个ROI,将其clone给B,然后对B进行二值化,输入

为B,输出为C,这时二值化完后的图像C跟ROI区域的图像区域不同。通过查看发现罪魁祸首是widthStep变了。

无意中解决了这个问题,做法如下:

方法1:就是在A图像中设置一个ROI,将其clone给B,新建一个C,大小、位数和通道数同B,将B clone给C,然后对C进行

InToIn的二值化操作,这个问题就解决了。

方法2:只拿二值化的阈值,在otsu函数里面不进行二值化操作,然后调用cvThreshold函数进行二值化。

现象1:异常

关于widthStep造成的问题

源代码:

// Otsu.cpp : Defines the entry point for the console application.
//

#include “stdafx.h”
#include <iostream.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <windows.h>

int height;int width;
int otsu(IplImage* A, IplImage* B)
{

long N = height * width;
int h[256];
double p[256],u[256],w[256];
for(int i = 0; i < 256; i++)  
{   
h[i] = 0;   
p[i] = 0;   
u[i] = 0;    
w[i] = 0;  
}

for(i = 0; i < height; i++)   
for(int j = 0; j < width; j++)   
for(int k = 0; k < 256; k++)    
{      
if(((uchar*)(A->imageData + A->widthStep*i))[j] == k)    
h[k]++;  
}

for(i = 0; i < 256; i++)   
p[i] = h[i] / double(N);

int T = 0;   
double uT,thegma2fang; 
double thegma2fang_max = -10000;

for(int k = 0; k < 256; k++)  
{    
uT = 0;     
for(i = 0; i <= k; i++) 
{     
u[k] += i*p[i];   
w[k] += p[i];    
}

for(i = 0; i < 256; i++)    
uT += i*p[i];     
thegma2fang = (uT*w[k] – u[k])*(uT*w[k] – u[k]) / (w[k]*(1-w[k]));
if(thegma2fang > thegma2fang_max)  
{     
thegma2fang_max = thegma2fang;    
T = k;  
}  
}

for(i = 0; i < height; i++)  //根据最佳阈值,对原图像进行处理二值化处理    
for(int j = 0; j < width; j++)      
if(((uchar*)(A->imageData + A->widthStep*i))[j] > T)   
((uchar*)(B->imageData + B->widthStep*i))[j] = 255;   
else       
((uchar*)(B->imageData + B->widthStep*i))[j] = 0;

return T;
}

int main(int argc, char** argv)
{ 
const char* filename = argc >= 2 ?argv[1] : “lena.jpg”;  
IplImage* source = cvLoadImage( filename, 0 );
int Th;

height = source->height;   
width = source->width;
CvRect rect;
rect.x=50;
rect.y=30;
rect.width=height/2;
rect.height=width/2;
IplImage *roi = cvCreateImage(cvSize(rect.width,rect.height),IPL_DEPTH_8U,1); 
IplImage *bw = cvCreateImage(cvSize(rect.width,rect.height),IPL_DEPTH_8U,1);

cvSetImageROI(source,rect);
roi=cvCloneImage(source);
cvResetImageROI(source);

Th = otsu(roi,bw);

printf(“Th=%d\n”,Th);
cvNamedWindow( “Resource”, 1 );   
cvShowImage( “Resource”, source ); 
cvNamedWindow( “Result”, 1 );  
cvShowImage( “Result”, roi); 
cvNamedWindow( “BW”, 1 );  
cvShowImage( “BW”, bw); 
cvWaitKey(0);
return 0;
}

现象2:正常

关于widthStep造成的问题

// Otsu.cpp : Defines the entry point for the console application.
//

#include “stdafx.h”
#include <iostream.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <windows.h>

int height;int width;
int otsu(IplImage* A, IplImage* B)
{

long N = height * width;
int h[256];
double p[256],u[256],w[256];
for(int i = 0; i < 256; i++)  
{   
h[i] = 0;   
p[i] = 0;   
u[i] = 0;    
w[i] = 0;  
}

for(i = 0; i < height; i++)   
for(int j = 0; j < width; j++)   
for(int k = 0; k < 256; k++)    
{      
if(((uchar*)(A->imageData + A->widthStep*i))[j] == k)    
h[k]++;  
}

for(i = 0; i < 256; i++)   
p[i] = h[i] / double(N);

int T = 0;   
double uT,thegma2fang; 
double thegma2fang_max = -10000;

for(int k = 0; k < 256; k++)  
{    
uT = 0;     
for(i = 0; i <= k; i++) 
{     
u[k] += i*p[i];   
w[k] += p[i];    
}

for(i = 0; i < 256; i++)    
uT += i*p[i];     
thegma2fang = (uT*w[k] – u[k])*(uT*w[k] – u[k]) / (w[k]*(1-w[k]));
if(thegma2fang > thegma2fang_max)  
{     
thegma2fang_max = thegma2fang;    
T = k;  
}  
}
return T;
}

int main(int argc, char** argv)
{ 
const char* filename = argc >= 2 ?argv[1] : “lena.jpg”;  
IplImage* source = cvLoadImage( filename, 0 );
int Th;

height = source->height;   
width = source->width;
CvRect rect;
rect.x=0;
rect.y=0;
rect.width=height/2;
rect.height=width/2;
IplImage *roi = cvCreateImage(cvSize(rect.width,rect.height),IPL_DEPTH_8U,1); 
IplImage *bw = cvCreateImage(cvSize(rect.width,rect.height),IPL_DEPTH_8U,1);

cvSetImageROI(source,rect);
roi=cvCloneImage(source);
cvResetImageROI(source);

bw = cvCloneImage(roi);
Th = otsu(bw,bw);
cvThreshold(roi,bw,Th,255,CV_THRESH_BINARY);

printf(“roi->widthStep=%d,bw->widthStep=%d\n”,roi->widthStep,bw->widthStep);
printf(“Th=%d\n”,Th);
cvNamedWindow( “Resource”, 1 );   
cvShowImage( “Resource”, source );
cvNamedWindow( “Result”, 1 );  
cvShowImage( “Result”, roi);
cvNamedWindow( “BW”, 1 );  
cvShowImage( “BW”, bw); 
cvWaitKey(0);
return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132961.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Java中级面试题及答案解析(4)

    Java中级面试题及答案解析(4)点击上方“Java知音”,选择“置顶公众号”技术文章第一时间送达!知音专栏 Javaweb练手项目源码下载常用设计模式完整系列篇100套IT类简历模板下载Java常见面试题汇总篇这里选了几道高频面试题以及一些解答。不一定全部正确,有一些是没有固定答案的,如果发现有错误的欢迎纠正,如果有更好的回答,热烈欢迎留言探讨。BIO、NIO和AIO的区别JavaBIO:同步并阻塞,服务器实现模式为一个连…

    2022年6月17日
  • 浅析Python优势所在

    浅析Python优势所在浅析Python优势所在 Python优势的最大有点就是比其他语言更简单易学,功能强大的解释型编程语言,它有简洁明了的语法,高效率的高层数据结构,能够简单而有效地实现面向对象编程,欢迎大家学习参考。如果你仅仅认为用Python优势只能写写“HelloWorld”,那你就大错特错了。Python可以被应用到网络开发、GUI开发、图形开发、Web开发、游戏开发、手机

    2022年10月4日
  • 计算机网络体系结构

    计算机网络体系结构计算机网络体系结构认识一下什么是计算机网络体系结构计算机网络是一个非常复杂、庞大的系统,涉及到很多组成部分。包括主机、路由器、各种链路、应用、协议、硬件、软件……等。那么是否存在一种体系结构可以

    2022年7月4日
  • android+号码归属地数据库,Android手机号码归属地的查询「建议收藏」

    android+号码归属地数据库,Android手机号码归属地的查询「建议收藏」一个简单的Demo,从聚合数据申请手机号码归属地数据接口;在EditText中输入待查询号码,获取号码后在子线程中使用HttpUrlconnection获取JSON数据,之后进行解析;数据获取完成后,在主线程中更新UI,显示获取的号码归属地信息。布局文件android:layout_width=”match_parent”android:layout_height=”match_parent”an…

    2022年7月22日
  • EasyPusher/EasyDarwin/EasyPlayer实现手机直播版本及效果整理「建议收藏」

    EasyPusher/EasyDarwin/EasyPlayer实现手机直播版本及效果整理「建议收藏」EasyPusher手机直播实现功能最近很多EasyDarwin爱好者提出了手机移动端直播的功能需求,尤其是如何做出像映客这样能够快速出画面播放的效果,经过一段时间的移动端和服务端的优化,EasyPusher直播推送+EasyDarwin流媒体服务器+EasyPlayer客户端播放已经非常好实现了这些需求,EasyPusher编码推送+EasyDarwin公网传输+EasyPlayer播放整个流程,

    2022年6月22日
  • Mac下mysql不能远程访问问题

    Mac下mysql不能远程访问问题

    2021年5月14日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号