我正在开发一种自动增强扫描35毫米幻灯片的程序.我正在寻找一种增强对比度和消除色偏的好算法.该算法必须是完全自动的,因为将有数千个图像要处理.这些是直接来自扫描仪的几个样本图像,仅针对网络裁剪和缩小尺寸:


我正在使用AForge.NET库,并尝试了HistogramEqualization和ContrastStretch过滤器.HistogramEqualization有利于最大化局部对比度但总体上不会产生令人满意的结果.ContrastStretch更好,但由于它单独拉伸每个色带的直方图,它有时会产生强烈的色偏:

为了减少颜色偏移,我UniformContrastStretch自己使用ImageStatistics和LevelsLinear类创建了一个过滤器.这对所有色带使用相同的范围,以较低的对比度为代价保留色彩.
ImageStatistics stats = new ImageStatistics(image);
int min = Math.Min(Math.Min(stats.Red.Min, stats.Green.Min), stats.Blue.Min);
int max = Math.Max(Math.Max(stats.Red.Max, stats.Green.Max), stats.Blue.Max);
LevelsLinear levelsLinear = new LevelsLinear();
levelsLinear.Input = new IntRange(min, max);
Bitmap stretched = levelsLinear.Apply(image);
Run Code Online (Sandbox Code Playgroud)

虽然图像仍然很蓝,所以我创建了一个ColorCorrection首先计算图像平均亮度的滤镜.然后为每个颜色通道计算伽马校正值,使得每个颜色通道的平均值将等于平均亮度.均匀对比度拉伸图像具有平均值R=70 G=64 B=93,平均亮度为(70 + 64 + 93) / 3 = 76.计算伽玛值R=1.09 G=1.18 B=0.80,得到的非常中性的图像具有R=76 G=76 B=76预期的平均值:

现在,解决真正的问题...我想将图像的平均颜色校正为灰色有点过于剧烈,会使一些图像在外观上显得相当沉闷,就像第二个样本(第一个图像是均匀拉伸的,接下来是相同的图像颜色校正):

在照片编辑程序中手动执行色彩校正的一种方法是对已知中性色(白色/灰色/黑色)的颜色进行采样,并将图像的其余部分调整为该颜色.但由于这个例程必须是完全自动的,所以这不是一个选择.
我想我可以为我的ColorCorrection滤镜添加强度设置,因此强度为0.5会将平均值的一半移动到平均亮度.但另一方面,一些图像可能会做得最好,没有任何颜色校正.
有什么想法可以获得更好的算法吗?或者某些方法来检测图像是否有偏色或者只是有很多颜色,比如第二个样本?
我想从Visual Studio远程调试在Linux上运行的C#控制台应用程序.这是我到目前为止发现的:
http://www.mono-project.com/Debugger
Mono运行时实现了一个调试接口,允许调试器和IDE调试托管代码.这称为软调试器,MonoDevelop,Xamarin Studio和Visual Studio(安装适当的插件时)以及命令行SDB客户端都支持它.
Mono提供了一个API来与调试器通信,并通过Mono.Debugger.Soft.dll程序集创建自己的调试UI.
下面的页面讨论了当前MonoVS调试器实现的一些问题,但它们对我来说都很好.
http://mono-project.com/Visual_Studio_Integration
该页面还链接到MonoVS的入门指南:
http://mono-project.com/GettingStartedWithMonoVS
其中包含MonoTools的下载链接:
http://mono-tools.com/download/
但是,下载链接现在重定向到:
在哪里我可以下载Xamarin Studio Starter Edition.单击"定价"链接,我发现至少需要Visual Studio支持的商业版,每年999美元.好吧,不,谢谢.
这就是我被困住的地方.我的环境的一些细节:
开发环境:
目标环境:
我有一个包含一些测试用例和一些普通测试的基础测试类:
[TestFixture]
public abstract class TestBase
{
[TestCase(1)]
[TestCase(2)]
[TestCase(3)]
public void TestA(int value)
{
// Perform test
}
[Test]
public void TestB()
{
// Perform test
}
}
Run Code Online (Sandbox Code Playgroud)
这些测试是从子类运行的,这些子类以不同的方式设置环境.子类只包含设置方法,没有测试.
[TestFixture]
public class LocalDatabaseTest : TestBase
{
[SetUp]
public void SetUp()
{
// Set up environment to use local db
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用ReSharper 6.1.1000.82在LocalDatabaseTest中运行所有测试,但只运行普通测试.使用TestCase的测试没有得到任何结果.如果我在TestBase类中选择TestA上的Run All,则运行所有测试用例(包括其他子类).我正在使用NUnit 2.6.2.12296.关于我做错了什么的任何想法?
在我的WinForm应用程序中,我有一个多行TextBox控件(uiResults),用于在处理大量项目时报告进度.使用AppendText非常适合在每次更新时自动滚动到底部,但如果用户向后滚动以读取一些旧数据,我需要关闭自动滚动.如果可能的话,我宁愿远离P/Invoke电话.
是否可以检测用户是否在不使用P/Invoke的情况下向后滚动?现在,我只检查SelectionStart哪个有效,但要求用户从文本框的末尾移动插入符号以停止自动滚动:
if(uiResults.SelectionStart == uiResults.Text.Length)
{
uiResults.AppendText(result + Environment.NewLine);
}
Run Code Online (Sandbox Code Playgroud)
我的主要问题是,当使用Text属性追加字符串时,文本框会滚动到开头.我试图通过存储插入位置并在更新后重置并滚动到它来解决这个问题,但是这会导致当前行移动到底部(当然,因为ScrollToCaret滚动的距离不超过将插入符号放入视图的必要距离).
[Continued from above]
else
{
int pos = uiResults.SelectionStart;
int len = uiResults.SelectionLength;
uiResults.Text += result + Environment.NewLine;
uiResults.SelectionStart = pos;
uiResults.SelectionLength = len;
uiResults.ScrollToCaret();
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一种用于微米级定位的自动对焦程序,因此我需要在图像之间找到非常小的聚焦/模糊差异.幸运的是,图像模式将始终相同(这些是原始2 MP图像的256x256中心裁剪):

Perfect focus | 50 µm off
Run Code Online (Sandbox Code Playgroud)
找到上面两个更好的聚焦图像不是问题,我想大多数算法都可以.但我真的需要比较焦点差异很小的图像,如下所示:

5 µm off | 10 µm off
Run Code Online (Sandbox Code Playgroud)
步进越来越接近最佳焦点的替代方案是找到在焦平面的相对侧具有相同量模糊的两个图像.例如,可以从-50μm保存图像,然后尝试在+50μm附近找到模糊相等的图像.假设图像在+58μm处发现,则焦平面应位于+4μm处.
有合适算法的想法吗?
对我的问题可能有一个非常简单的解决方案,但我正在为它制定一个好的搜索短语.我有一个包含时间戳和计数的表:
2013-08-15 14:43:58.447 5
2013-08-15 14:44:58.307 12
2013-08-15 14:45:58.383 14
2013-08-15 14:46:58.180 0
2013-08-15 14:47:58.210 4
2013-08-15 14:48:58.287 6
2013-08-15 14:49:58.550 12
2013-08-15 14:50:58.440 2
2013-08-15 14:51:58.390 5
Run Code Online (Sandbox Code Playgroud)
如您所见,计数增加,然后偶尔清空.搜索count = 0的行很容易,但有时计数会在记录零计数之前增加.在14:49,计数为12,然后重置为0并在14:50的下一个日志之前递增到2.
我需要列出计数小于之前的计数的时间戳:
2013-08-15 14:46:58.180 0
2013-08-15 14:50:58.440 2
Run Code Online (Sandbox Code Playgroud)
我开始在表本身上进行连接,比较两行,但SQL很快就变得非常混乱了.
我们使用的是一个对3D测量数据进行计算的类库,它公开了一个方法:
MeasurementResults Calculate(IList<IList<Measurement>> data)
Run Code Online (Sandbox Code Playgroud)
我想允许使用任何可索引的列表列表(当然是Measurement)调用此方法,例如:
Measurement[][] array;
List<List<Measurement>> list;
Run Code Online (Sandbox Code Playgroud)
使用数组调用方法工作正常,这有点奇怪.这里有一些编译技巧吗?试着打电话List给出了熟悉的错误:
cannot convert from 'List<List<Measurement>>' to 'IList<IList<Measurement>>'
Run Code Online (Sandbox Code Playgroud)
所以,我编写了一个facade类(包含其他一些东西),使用一个方法在参数和方法之间拆分泛型定义,并在必要时转换为IList类型:
MeasurementResults Calculate<T>(IList<T> data) where T : IList<Measurement>
{
IList<IList<Measurement>> converted = data as IList<IList<Measurement>>;
if(converted == null)
converted = data.Select(o => o as IList<Measurement>).ToList();
return Calculate(converted);
}
Run Code Online (Sandbox Code Playgroud)
这是解决问题的好方法,还是你有更好的想法?
此外,在测试问题的不同解决方案时,我发现如果已经使用IEnumerable而不是声明类库方法IList,则可以使用数组和以下方法调用该方法List:
MeasurementResults Calculate(IEnumerable<IEnumerable<Measurement>> data)
Run Code Online (Sandbox Code Playgroud)
我怀疑有一些编译器技巧再次出现,我想知道为什么他们没有在他们IList工作的List时候合作?
我正在编写一个在木材场使用的应用程序。给定一定数量的板或梁长度,目标是计算所需的板数量,同时最大限度地减少浪费。例如,对于某一特定维度,可能有以下购物清单:
3x 2.9 米
5x 1.6 米
21x 0.9 米
在木材场,人们会检查可用的木板长度并将其输入应用程序。假设此尺寸有 4.8 米长。
一个简单的方法是尝试以降序安装剩余的板:
2.9 + 2.9 = 5.8 所以这不适合 4.8 米的板子
2.9 + 1.6 = 4.5 所以没关系。
任何长度都不小于剩余的 0.3 米,所以这块板是“满的”。我们将再安装两个这种类型,然后我们还有以下长度可以安装:
2x 1.6 米
21x 0.9 米
好的,所以这个算法运行得相当好。但是,如果我们不是拟合 2.9 + 1.6,而是拟合 2.9 + 0.9 + 0.9 = 4.7 呢?然后我们将每块板浪费 0.1 米,而不是 0.3 米。
枚举所有可能的组合的一个问题是,每个长度在一块板上可能出现不止一次,并且板上适合的长度数量也会有所不同。是否有一种已知的算法可以用来最大限度地减少所有电路板的总浪费?
此外,如果木材场有两种或更多长度可用怎么办?例如 5.4、4.8 和 3.6 米?这肯定会使事情复杂化。可以为每个可用长度运行选定的算法,并选择浪费最少的长度。但最优雅的解决方案是允许混合可用长度,因此最佳答案可能是 1x 5.4、3x 4.8、6x 3.6。但是对于初学者来说,我很乐意将答案限制为一个长度。
SQL小提琴:http://sqlfiddle.com/#!3/9b459/6
我有一个表格,其中包含"你会参加这个活动吗?"这个问题的答案.每个用户可能会多次响应,所有答案都会存储在表格中.通常我们只对最新的答案感兴趣,并且我正在尝试构建一个有效的查询.我正在使用SQL Server 2008 R2.
一个事件的表内容:

Column types: int, int, datetime, bit
Primary key: (EventId, MemberId, Timestamp)
Run Code Online (Sandbox Code Playgroud)
请注意,会员18首先回答否,然后回答是,会员20首先回答是,然后回答否,会员11回答否,然后回答否.我想过滤掉这些成员的第一个答案.此外,可能会有多个应该过滤的答案 - 例如,用户可能会回答是,是,否,是,否,否,否.
我尝试了一些不同的想法,并通过输入所有查询,选择显示估计执行计划并比较每个查询的总成本(百分比),在SQL Server Management Studio中对它们进行了评估.这是评估性能的好方法吗?
到目前为止测试的不同查询:
-----------------------------------------------------------------
-- Subquery to select Answer (does not include Timestamp)
-- Cost: 63 %
-----------------------------------------------------------------
select distinct a.EventId, a.MemberId,
(
select top 1 Answer
from Attendees
where EventId = a.EventId
and MemberId = a.MemberId
order by Timestamp desc
) as Answer
from Attendees a
where a.EventId = 68
-----------------------------------------------------------------
-- Where with subquery …Run Code Online (Sandbox Code Playgroud) 我有一个五阶多项式:
y = ax 5 + bx 4 + cx 3 + dx 2 + ex + f
系数af是已知的,我需要计算给定y的x.我可以使用Newton-Raphson算法或类似算法,但如果可能的话,我更喜欢非迭代解决方案.
编辑:我想在发布我的问题之前我没有想到这一点.我的多项式系数是根据采样数据计算的,在这种特殊情况下只有一个根.当然,在一般情况下,当然可能有五个不同的根源.我想我也会将采样数据拟合为逆多项式,并用它来计算y中的x.