Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
成像仪锐化内核产生奇数结果C#_C#_Image Processing - Fatal编程技术网

成像仪锐化内核产生奇数结果C#

成像仪锐化内核产生奇数结果C#,c#,image-processing,C#,Image Processing,我正在制作一个小应用程序,你可以用C#对图像进行锐化或模糊处理。到目前为止,blur可以完美地处理所有大小的内核。然而,锐化似乎会导致这种奇怪的噪音/静态图像(你会在没有信号的电视上看到这种图像>见下文)。我已经多次对此进行了重新编码,这次我试图从python复制一个解决方案,以防我一直搞砸它。以下是我的锐化技巧: Color[,]clone=ud.CurrentSelected.\u位图//以矩阵形式获取当前图像 int[,]kernel={{0,-1,0},{-1,5,-1},{0,-1,0

我正在制作一个小应用程序,你可以用C#对图像进行锐化或模糊处理。到目前为止,blur可以完美地处理所有大小的内核。然而,锐化似乎会导致这种奇怪的噪音/静态图像(你会在没有信号的电视上看到这种图像>见下文)。我已经多次对此进行了重新编码,这次我试图从python复制一个解决方案,以防我一直搞砸它。以下是我的锐化技巧:

Color[,]clone=ud.CurrentSelected.\u位图//以矩阵形式获取当前图像
int[,]kernel={{0,-1,0},{-1,5,-1},{0,-1,0};
int offset=1;
int size=100//图像是100x100 atm
对于(int x=0;x不用于显示
对于(int A=0;A<3;A++){
对于(int B=0;B<3;B++){
int deltaX=x+A-抵销;
int deltaY=y+B-偏移量;
非显示颜色像素=ud.CurrentSelected.\u位图[deltaX,deltaY];
int r=pixel.r*内核[A,B];
int g=pixel.g*内核[A,B];
intb=pixel.b*内核[A,b];
附件R+=R;
根据G+=G;
附件B+=B;
}
}
克隆[x,y]=acc;
}
}
ud.CurrentSelected.\u位图=克隆;
这只是计算部分,显示图像的是:

Bitmap b=新位图(ud.CurrentSelected.\u Bitmap.Width,ud.CurrentSelected.\u Bitmap.Height);
对于(int x=0;x
如果有人想知道,
nondisplayedColor
结构就是这样的:

public结构非显示颜色{
公共非显示颜色(整数r、整数g、整数b){
R=R;
G=G;
B=B;
A=255;
}
公共INTA;
公共INTR;
公共INTG;
公共int B;
公共静态隐式运算符颜色(非显示颜色c){
返回颜色.FromArgb((字节)c.A,(字节)c.R,(字节)c.G,(字节)c.B);
}
公共静态隐式运算符非显示颜色(c色){
返回新的非显示颜色(c.R、c.G、c.B){A=c.A};
}
}
最终的结果,是

提前谢谢你的帮助。
注:我知道锁定位的速度会快得多,但我追求的是简单而不是速度,SetPixel(至少对我来说)要简单得多。

这段代码有太多问题。1.您使用的是所有整数值:需要使用
float
double
精度计算RGB值,然后在值超过边界2时进行规格化。过滤器偏移量为
int filterOffset=(filterWidth-1)/2
:矩阵为
3x3
,两个偏移量
=1
3。因此,外部循环在范围
[filterOffset:bitmap.Height-filterOffset]
4内。因此,内部循环的范围是
[-filterOffset:filterOffset]
。应用乘数和偏差会有所帮助,因为它们当然是浮点值。另外,请注意,卷积只处理矩阵,因此锐化滤波器的卷积与模糊滤波器相同,只是矩阵值不同。当锐化滤镜是这样的时候,我怀疑模糊滤镜是否有效我建议使用
Bitmap.LockBits
将卷积应用于内存数据:在这种操作中不建议使用
SetPixel()
。@Jimi将所有值更改为
float
完全不会影响输出。我知道偏移量是1,这是我设定的。3-我知道,我现在忽略了外部边界。是的,我也知道。这是一张模糊过滤器的图像。我很肯定这是正确的。您已经将一个
偏移量
硬编码为
1
(您不应该这样做,这仅意味着3x3矩阵),但是您的外部循环从
0
开始,而不是从
偏移量
开始,并且内部循环在
[0;2]
范围内,而不是从
[-offset;offset]
开始。您还需要考虑位图步幅(扫描线的实际宽度)和每种颜色的字节(如果只使用32 bpp图像,那么它总是<代码> 4 < /代码>)。因此,首先定义像素大小:
int pixelSize=Image.GetPixelFormatSize([Bitmap].PixelFormat)/8)
,然后外部循环中的缓冲区位置是
bufferOffset=offsetY*[Image].Stride+offsetX*pixelSize
。[…][…]然后,内部循环使用缓冲区偏移量定义过滤器偏移量,如
filterOffset=bufferOffset+(filterX*pixelSize)+(filterY*[Image].Stride)
。您必须重新访问所描述的
A
B
值(可能使用更独特的名称,表示函数,因此当其他人阅读您的代码时,很清楚这些值的含义)。如果你愿意的话,我可以把所有这些的总数都寄出去。