C#阈值分割处理图像

LBY_LPLFC 2016-03-04 02:21:28
想用c#编一个可以对图像阈值分割的函数,但是老是运行不正确
private static Bitmap robot(Bitmap curBitmap)
{
Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);
System.Drawing.Imaging.BitmapData bmpData = curBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, curBitmap.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = curBitmap.Width * curBitmap.Height;
byte[] grayValues = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(ptr, grayValues, 0, bytes);

byte T = 0, S = 0;
byte[] neighb = new byte[bytes];
byte temp = 0;
byte maxGray = 0;
byte minGray = 255;
int[] countPixel = new int[256];
for (int i = 0; i < grayValues.Length; i++)
{
temp = grayValues[i];
countPixel[temp]++;
if (temp > maxGray)
{
maxGray = temp;
}
if (temp < minGray)
{
minGray = temp;
}
}
double mu1, mu2;
int numerator;
double sigma;
double tempMax = 0;
double w1 = 0, w2 = 0;
double sum = 0;
numerator = 0;
for (int i = minGray; i <= maxGray; i++)
{
sum += i * countPixel[i];
}
for (int i = minGray; i < maxGray; i++)
{
w1 += countPixel[i];
numerator += i * countPixel[i];
mu1 = numerator / w1;
w2 = grayValues.Length - w1;
mu2 = (sum - numerator) / w2;
sigma = w1 * w2 * (mu1 - mu2) * (mu1 - mu2);

if (sigma > tempMax)
{
tempMax = sigma;
T = Convert.ToByte(i);
}
} for (int i = 0; i < bytes; i++)
{
if (grayValues[i] < T)
grayValues[i] = 0;
else
grayValues[i] = 255;

}

System.Runtime.InteropServices.Marshal.Copy(grayValues, 0, ptr, bytes);
curBitmap.UnlockBits(bmpData);
return curBitmap;
}
这是程序,处理时总是只能处理上半部分,有没有大神能给改改,或者给一个更好的处理方法。
...全文
499 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
橘子皮... 2019-05-22
  • 打赏
  • 举报
回复
https://docs.microsoft.com/zh-cn/dotnet/api/system.drawing.imaging.imagelockmode?redirectedfrom=MSDN&view=netframework-4.8
橘子皮... 2019-05-22
  • 打赏
  • 举报
回复
LockBits 这个方法是不是线程安全的??
qq_44025096 2019-05-21
  • 打赏
  • 举报
回复
int bytes = curBitmap.Width * curBitmap.Height;改成int bytes = bmpData.Height* bmpData.Stride ;
LBY_LPLFC 2016-03-04
  • 打赏
  • 举报
回复
能具体点吧,没听懂
xuzuning 2016-03-04
  • 打赏
  • 举报
回复
您忘了每个像素是由三原色组成的
C#数字图像处理算法典型实例随书光盘 精选数字图像处理领域中的一些应用实例,以理论和实践相结合的方式,系统地介绍了如何使用C#进行数字图像处理C#数字图像处理算法典型实例共11章,分别讲述了图像的点运算、几何运算、数学形态学图像处理方法、频率变换、图像平滑与去噪、边缘检测、图像分割、图像压缩编码和彩色图像处理等相关技术。本书的光盘中附有相关章节的实现代码,可供广大的读者参考、阅读。 C#数字图像处理算法典型实例内容丰富,叙述详细,实用性强,适合于数字图像处理工作者阅读参考。 C#数字图像处理算法典型实例目录: 第1章 绪论  1.1 数字图像处理概述  1.2 C#概述   1.2.1 C#特点   1.2.2 WinForm编程   1.2.3 GDI+  1.3 补充说明 第2章 C#数字图像处理的3种方法  2.1 C#图像处理基础   2.1.1 Bitmap类   2.1.2 BitmapData类   2.1.3 Graphics类  2.2 彩色图像灰度化  2.3 彩色图像灰度化编程实例   2.3.1 使用图像   2.3.2 图像处理的3种方法  2.4 小结 第3章 点运算及直方图  3.1 灰度直方图   3.1.1 灰度直方图定义   3.1.2 灰度直方图编程实例  3.2 线性点运算   3.2.1 线性点运算定义   3.2.2 线性点运算编程实例  3.3 全等级直方图灰度拉伸   3.3.1 灰度拉伸定义   3.3.2 灰度拉伸编程实例  3.4 直方图均衡化   3.4.1 直方图均衡化定义   3.4.2 直方图均衡化编程实例  3.5 直方图匹配   3.5.1 直方图匹配定义   3.5.2 直方图匹配编程实例  3.6 小结 第4章 几何运算  4.1 图像平移   4.1.1 图像平移定义   4.1.2 图像平移编程实例  4.2 图像镜像   4.2.1 图像镜像变换定义   4.2.2 图像镜像编程实现  4.3 图像缩放   4.3.1 图像缩放定义   4.3.2 灰度插值法   4.3.3 图像缩放编程实例  4.4 图像旋转   4.4.1 图像旋转定义   4.4.2 图像旋转编程实现  4.5 小结 第5章 数学形态学图像处理  5.1 图像腐蚀运算   5.1.1 图像腐蚀运算定义   5.1.2 图像腐蚀运算编程实例  5.2 图像膨胀运算   5.2.1 图像膨胀运算定义   5.2.2 图像膨胀运算编程实例  5.3 图像开运算与闭运算   5.3.1 图像开运算与闭运算定义   5.3.2 图像开运算编程实例   5.3.3 图像闭运算编程实例  5.4 击中击不中变换   5.4.1 击中击不中变换定义   5.4.2 击中击不中变换编程实例  5.5 小结 第6章 频率变换  6.1 二维离散傅里叶变换  6.2 快速傅里叶变换   6.2.1 快速傅里叶变换概述   6.2.2 快速傅里叶变换编程实例  6.3 幅度图像和相位图像  6.4 频率成分滤波   6.4.1 频率成分滤波原理   6.4.2 频率成分滤波编程实例  6.5 频率方位滤波   6.5.1 频率方位滤波原理   6.5.2 频率方位滤波编程实例  6.6 小结 第7章 图像平滑与去噪  7.1 噪声模型   7.1.1 噪声概述   7.1.2 噪声模型编程实例  7.2 均值滤波与中值滤波   7.2.1 均值滤波与中值滤波原理   7.2.2 均值滤波与中值滤波编程实例  7.3 灰度形态学滤波   7.3.1 灰度形态学原理   7.3.2 灰度形态学去噪原理   7.3.3 灰度形态学去噪编程实现  7.4 小波变换去噪   7.4.1 小波变换概述   7.4.2 小波变换去噪原理   7.4.3 小波变换去噪编程实例  7.5 高斯低通滤波   7.5.1 高斯低通滤波原理   7.5.2 高斯低通滤波编程实例  7.6 统计滤波   7.6.1 统计滤波原理   7.6.2 统计滤波编程实例  7.7 小结 第8章 边缘检测  8.1 模板算子法   8.1.1 模板算子法原理   8.1.2 模板算子法编程实例  8.2 高斯算子   8.2.1 高斯算子原理   8.2.2 高斯算子编程实例  8.3 Canny算子   8.3.1 Canny边缘检测原理   8.3.2 Canny算子编程实例  8.4 形态学边缘检测   8.4.1 形态学边缘检测原理   8.4.2 形态学边缘检测编程实例  8.5 小波变换边缘检测   8.5.1 小波变换边缘检测原理   8.5.2 小波变换边缘检测编程实例  8.6 金字塔方法   8.6.1 金字塔方法原理   8.6.2 金字塔方法编程实例  8.7 小结 第9章 图像分割  9.1 Hough变换   9.1.1 Hough变换原理   9.1.2 Hough变换编程实例  9.2 阈值法   9.2.1 自动阈值选择法原理   9.2.2 阈值分割法编程实例  9.3 特征空间聚类法   9.3.1 K-均值聚类法原理   9.3.2 ISODATA聚类法原理   9.3.3 特征空间聚类法编程实例  9.4 松弛迭代法   9.4.1 松弛迭代法原理   9.4.2 松弛迭代法编程实例  9.5 小结 第10章 图像压缩编码  10.1 哈夫曼编码   10.1.1 哈夫曼编码原理   10.1.2 哈夫曼编码编程实例  10.2 香农编码   10.2.1 香农编码原理   10.2.2 香农编码编程实例  10.3 香农-弗诺编码   10.3.1 香农-弗诺编码原理   10.3.2 香农-弗诺编码编程实例  10.4 行程编码   10.4.1 行程编码原理   10.4.2 行程编码编程实例  10.5 LZW编码   10.5.1 LZW编码原理   10.5.2 LZW编码编程实例  10.6 预测编码   10.6.1 DPCM原理   10.6.2 预测编码编程实例  10.7 傅里叶变换编码   10.7.1 傅里叶变换编码原理   10.7.2 傅里叶变换编码编程实例  10.8 小波变换编码   10.8.1 小波变换编码原理   10.8.2 小波变换编码编程实例  10.9 小结 第11章 彩色图像处理  11.1 彩色空间   11.1.1 RGB彩色空间和HSI彩色空间   11.1.2 彩色空间转换编程实例   11.1.3 彩色空间分量调整编程实例  11.2 伪彩色处理   11.2.1 伪彩色处理原理   11.2.2 伪彩色处理编程实例  11.3 彩色图像直方图均衡化   11.3.1 彩色图像直方图均衡化原理   11.3.2 彩色图像直方图均衡化编程实例  11.4 彩色图像平滑处理   11.4.1 彩色图像平滑处理原理   11.4.2 彩色图像平滑处理编程实例  11.5 彩色图像锐化处理   11.5.1 彩色图像锐化处理原理   11.5.2 彩色图像锐化处理编程实例  11.6 彩色图像边缘检测   11.6.1 彩色图像边缘检测原理   11.6.2 彩色图像边缘检测编程实例  11.7 彩色图像分割   11.7.1 彩色图像分割原理   11.7.2 彩色图像分割编程实例  11.8 小结

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧