- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
对于我的工作,我需要将 JPG 中的伪彩色 RGB 值替换为灰度以进行处理。 “颜色”图像具有特定范围的 RGB 颜色(20 或 255,取决于来源)需要链接到灰度值以便对输出图像进行一些测量。使用原始 RGB 值非常困难,因为指定的范围只能在 PNG 或 tiff 格式中正常工作,但转换为 JPG 会创建一些 RGB 值,这些值与预期的 RGB 值有点偏离,这使我现有的分析变得毫无用处.
我在其中一个答案中找到了这段不错的代码,作为将某个点的颜色四舍五入到字典中最接近的相似颜色的解决方案。
def distance(c1, c2):
(r1,g1,b1) = c1
(r2,g2,b2) = c2
return math.sqrt((r1 - r2)**2 + (g1 - g2) ** 2 + (b1 - b2) **2)
colors = list(rgb_code_dictionary.keys())
closest_colors = sorted(colors, key=lambda color: distance(color, point))
closest_color = closest_colors[0]
code = rgb_code_dictionary[closest_color]
Python PIL - Finding Nearest Color (Rounding Colors)
rgb_code_dictionary 被 rgb 值字典替换,我想应用相应的灰度值。
这真的很棒,它产生了我需要的输出。但是,如果将此代码应用于完整图像(每张图像只需要 18 秒,但我有几千张图像要处理),此代码会非常慢,因为我需要将每个像素提供给函数以获得最接近的匹配。
我发现了另一段可以非常快速地替换颜色的代码:
Replacing RGB values in numpy array by integer is extremely slow
# Extract color codes and their IDs from input dict
colors = np.array(_color_codes.keys())
color_ids = np.array(_color_codes.values())
# Initialize output array
result = np.empty((img_arr.shape[0],img_arr.shape[1]),dtype=int)
result[:] = -1
# Finally get the matches and accordingly set result locations
# to their respective color IDs
R,C,D = np.where((img_arr == colors[:,None,None,:]).all(3))
result[C,D] = color_ids[R]
但是只有当字典中的 RGB 值与图像中的 RGB 值完美匹配时,这个方法才有效。理想情况下,我会将两者合并在一起,以获得快速可靠的功能来替换颜色。但是我在将第一段代码转换为 numpy 中的“where”语句时遇到问题,以加快将 RGB 值与灰度值交换的整个过程。
由于我不是受过教育的程序员(而且对 Python 来说真的很陌生),所以我不知道如何解决这个问题。在许多论坛上搜索并没有帮助找到一个好的解决方案(我理解并且可以自己实现),因此我的问题。
是否有功能可以实现我的意图?或者有没有办法将这 2 个函数合并为一个,以便转换既快速又正确?
非常感谢任何帮助(但如果可能的话,请保持简单一点:-))
谢谢
编辑:我最终得到了另一种解决方案,因为我在安装 Mark Setchell 提出的解决方案时遇到了一些困难。我非常确信使用 ImageMAgick 是解决我的特定问题的最佳解决方案,遗憾的是,由于我 PC 上的安全设置,我无法安装该解决方案。
我想出的解决方案基本上是将彩色图像转换为灰度,然后将另一个灰度值应用于每个像素,其中新灰度将跨越旧灰度值的 +/- 6 个灰度值。 (例如,从 242 到 255 的所有内容都将替换为 255)该解决方案并不能真正快速运行,也不能提供最佳结果,但目前看来,这在不久的将来似乎是可行的。
感谢您的回答,它帮助我重新思考了这个过程。
最佳答案
嗯... JPEG 很少是“数据” 类型图像的好选择,因为其固有的损耗 - 总是更喜欢 PNG
、TIFF
,或者为了最简单起见,古老的 NetPBM 格式(PGM
、PPM
、PAM
)和 PFM
用于 float 。
无论如何,您可以在命令行中使用 ImageMagick 非常快速地重新映射图像,而无需编码,它安装在大多数 Linux 发行版上,也可用于 macOS 和 Windows。
因此,将所需颜色的字典(仅一行像素)保存为名为 LUT.png
(查找表)的 PNG
文件。我将使用 ImageMagick 制作一个带有红色、柠檬绿、蓝色、黑色和白色的小图案,向您展示它的外观:
convert xc:red xc:lime xc:blue xc:white xc:black +append LUT.png
旁白:如果您将查找表的颜色作为 RGB 三元组而不是命名颜色,则可以像这样使用它们:
convert xc:"rgb(255,0,0)" xc:"rgb(0,255,0)" xc:"rgb(0,0,255)" +append LUT.png
现在拍一张你的照片,憨 bean 先生说:
并将包含的颜色映射到查找表:
convert MrBean.jpg +dither -map LUT.png result.png
请注意,从 ImageMagick v7 开始,convert
命令变为 magick
,即:
magick MrBean.jpg +dither -map LUT.png result.png
如果您有成百上千的事情要做,您可以通过使用 GNU Parallel 使用所有那些可爱的 CPU 核心并行地很好、快速地完成它们:
parallel convert {} +dither -map LUT.png {.}.png ::: *.jpg
哪里:
{}
表示当前正在处理的文件,{.}
表示没有扩展名的文件,:::
表示要处理的文件名的开头显然,在使用 Internet 上陌生人建议的任何内容之前,先进行备份并只处理数据的子集 ;-)
关于python - RGB LUT 到灰度 - 红外成像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48645896/
有谁知道是否有办法在悬停时使图像灰度 - 除了创建 2 个单独的图像并更改 src 之外。 谢谢 编辑 - 半工作代码...: $(document).ready(function() {
我正在使用 flexbox 构建一个网站,其中包含 16x9 视频缩略图的 3 乘任意网格。我想在彩色缩略图变成单调(灰度 + x% 透明颜色层)的地方创建翻转,上面有一个白色 Logo 。 尽管我尽
现在泰国很多网站都是灰度的,大多使用-webkit-filter: grayscale(100%), filter: grayscale(100%)等。 我知道我们可以像往常一样“手动”(在 Chro
给定一张灰度的图像,我如何获得该位置的灰度像素值? 这始终将 temp 输出为 -16777216(黑色)。 public void testMethod() { int width = im
灰度化一个可绘制对象: ColorMatrix matrix = new ColorMatrix(); matrix.setSaturation(200); ColorMatrixColorFilte
我正在尝试创建一种悬停效果,其中图像以全彩色开始,当我将鼠标悬停在图像上时,我希望它有一个蓝色覆盖层。 事实是,只有一个简单的蓝色叠加层,它只是在彩色图像之上放置一个半透明的蓝色 block ……这意
将颜色 Drawable 转换为灰度的正确方法是什么(表示禁用状态)? 编辑: 黑白 => 灰度 最佳答案 我知道这个问题是不久前提出的,但我遇到了一个更简单的解决方案,如果你有一个 Drawable
我需要将 CMYK 图像转换为灰度 CMYK 图像。起初我以为我可以使用与 RGB -> 灰度转换相同的方法,比如 (R + G + B)/3 或 max(r, g, b)/2 + min(r, g,
我遇到了一些将 UIImage 更改为灰度的代码的问题。它可以在 iPhone/iPod 上正常工作,但在 iPad 上,任何已经绘制的内容都会在此过程中被拉伸(stretch)和扭曲。 它有时也只在
假设我有: int x = 140; 我想得到的结果: int y = new Color(x, x, x).getRGB() 来自 Java API 文档: getRGB() Gets the RG
我在我的论文中使用 opencv 用 c++ 编写了一个 block 匹配算法。它正在处理灰度图片并通过其绝对像素地址寻址 IPLImage。 我必须将 IPLImage 分成相同大小的 block
我有一个带有背景图像的 div,我正在使用过滤器以黑白方式显示它 (filter: grayscale(100%);)。我现在正试图在该 div 中放置一个颜色图标。尝试将图标设置为 grayscal
我会避免使用 cvtColor(frame, image, CV_RGB2GRAY); 转换摄像机拍摄的每一帧无论如何设置 VideoCapture 直接进入灰度? 例子: VideoCapture
我有一些 CSS 可以将我的图像变成灰度(带有一些用于 Firefox 的 svg) img.grayscale{ filter: grayscale(100%);
有没有什么方法可以在不丢失任何其他功能的情况下以灰度显示 Google map (通过 Javascript API 嵌入)? 最佳答案 是的,他们在 API 的 V3 中引入了 StyledMaps
我正在使用 Java Swing 制作桌面应用程序。 在我的应用程序中,我对 16 位灰度和 tiff 图像进行了一些图像处理。 在我的应用程序中,用户可以通过将图像拖放到 JDesktopPane
我正在为学校的一个项目执行此操作,稍后将添加更多功能,但我在完成基本设置时遇到了困难。 我最初尝试在 C++ 中执行此操作,但在阅读了有关 BufferedImage 的一些文档后决定切换到 Java
我使用 Canvas 更改网页上图像的颜色(本例为灰度)。但是,通过使用以下代码,仅更改了最后一张图像。 但我想更改网页上所有图像的颜色 $(function(){ var theI
首先我要警告你,我只是一个试图让事情发挥作用的物理学家,我对 C++ 的知识基本上是不存在的。 我目前正在使用 GATE 模拟 CT 扫描仪,我需要将输出转换为 bmp 文件。 Gate 制作了一系列
link 在 chrome 中,它运行完美。但是,在 Firefox 中,图像不会出现。 我已经设置了 SVG 的 mime 类型,并且 mime 类型检查器显示 mime 类型是正确的。 有人能帮帮
我是一名优秀的程序员,十分优秀!