图像切割无外乎用颜色(rgb,hsv等)形状(凹点,凸包,各种矩)区分,
纹理也很多,常用GLCM灰度共生矩阵,欺负人,又是opencv版本有,适合C#版本的没有,
即便有,也大多是基于标准矩形的,但实际应用的时候,我们往往要分析不规则图形。
本来想做个mask图像后,把灰度0-0(意思是某像素为0,该左侧的像素也为零,具体参考GLCM)剔除就行了,后来想想不对,万一图像内部也有0-0的像素,剔除了会造成干扰的。
水平不高,硬写了一段c#版本的非标GLCM,各位读者先凑合用吧,有心的帮我完善一下。
写成类了,如下:
256表示灰度级数,bp是灰度图,mask是灰度图的蒙版,a和b表示灰度值
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Drawing.Imaging;
namespace Count_Num
{
public class GLCM
{
public double[,] glmc;
double energy; // 能量
double entropy; // 熵
double contrast; // 对比度
double idMoment; // 逆差分矩, inverse difference moment
public double Energy { get => energy; set => energy = value; }
public double Entropy { get => entropy; set => entropy = value; }
public double Contrast { get => contrast; set => contrast = value; }
public double IdMoment { get => idMoment; set => idMoment = value; }
public GLCM(int size)
{
glmc = new double[size, size];
}
public unsafe double[,] calGLCM(Bitmap bp, Bitmap mask,int Size,int kind)
{
double[,] glmc = new double[Size, Size];
for (int i = 0; i < Size; i++)
{
for (int j = 0; j < Size; j++)
{
if (kind == 0)
glmc[i, j] = get_Oglmc(bp,mask,i,j);
if (kind == 90)