我想在TIFF文件中操作RGB波段并在matplotlib上输出灰度图.到目前为止,我有这个代码,但我无法在灰度上得到它:
import scipy as N
import gdal
import sys
import matplotlib.pyplot as pyplot
tif = gdal.Open('filename.tif')
band1 = tif.GetRasterBand(1)
band2 = tif.GetRasterBand(2)
band3 = tif.GetRasterBand(3)
red = band1.ReadAsArray()
green = band2.ReadAsArray()
blue = band3.ReadAsArray()
gray = (0.299*red + 0.587*green + 0.114*blue)
pyplot.figure()
pyplot.imshow(gray)
pylab.show()
Run Code Online (Sandbox Code Playgroud)
这些是数组:
[[255 255 255 ..., 237 237 251]
[255 255 255 ..., 237 237 251]
[255 255 255 ..., 237 237 251]
...,
[237 237 237 ..., 237 237 251]
[237 237 …Run Code Online (Sandbox Code Playgroud) 我有一个对应于“灰度位图”(一个字节-> 一个像素)的字节数组,我需要为此图像创建一个 PNG 文件。
下面的方法有效,但创建的 png 很大,因为我使用的位图是 ARGB_8888 位图,每个像素需要 4 个字节而不是 1 个字节。
我无法让它与 ARGB_8888 不同的其他 Bitmap.Config 一起工作。也许 ALPHA_8 是我需要的,但我一直无法让它工作。
我也尝试过其他一些帖子中包含的 toGrayScale 方法(在 Android 中将位图转换为灰度),但我对大小有同样的问题。
public static boolean createPNGFromGrayScaledBytes(ByteBuffer grayBytes, int width,
int height,File pngFile) throws IOException{
if (grayBytes.remaining()!=width*height){
Logger.error(Tag, "Unexpected error: size mismatch [remaining:"+grayBytes.remaining()+"][width:"+width+"][height:"+height+"]", null);
return false;
}
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
// for each byte, I set it in three color channels.
int gray,color;
int x=0,y=0;
while(grayBytes.remaining()>0){
gray = grayBytes.get();
// integer may be …Run Code Online (Sandbox Code Playgroud) 我想在没有任何内置 Open-CV 函数的情况下将此 RGB 编码为灰度转换器。这是我的代码的样子
import cv2 , numpy
def GrayConvertor(img):
rows , cols , layers = img.shape
matrix = numpy.zeros((rows , cols))
for i in range(rows):
for j in range(cols):
val = 0.114 * (img[i][j][0]) + 0.587 * (img[i][j][1]) + 0.299 * (img[i][j][2])
fraction = val - int(val)
if fraction >= 0.5:
matrix[i][j] = (int(val) + 1)
else:
matrix[i][j] = int(val)
cv2.imshow("gray" , matrix)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)
但是它显示一个空白图像,有什么想法吗?
这是我的代码.这很简单.
Mat image = imread("filename.png");
imshow("image", image);
waitKey();
//Image looks great.
Mat image_gray;
image.convertTo(image_gray, CV_RGB2GRAY);
imshow("image", image_gray);
waitKey();
Run Code Online (Sandbox Code Playgroud)
但是当我调用该image.convertTo(image_gray, CV_RGB2GRAY);行时,我收到以下错误消息:
OpenCV Error: Assertion failed (func != 0) in unknown function, file ..\..\..\sr
c\opencv\modules\core\src\convert.cpp, line 1020
Run Code Online (Sandbox Code Playgroud)
使用OpenCV 2.4.3
请耐心等待,我几周前才开始使用 python。
我正在使用 JES。
我做了一个将图片转换为灰度的函数。我为每种颜色 r 和 r1、g 和 g1、b 和 b1 创建了两个名称。这背后的想法是将原始值保留在内存中,以便图片可以恢复为其原始颜色。
def grayScale(pic):
for p in getPixels(pic):
r = int(getRed(p))
g = int(getGreen(p))
b = int(getBlue(p))//I have tried this with and without the int()
r1=r
g1=g
b1=b
new = (r + g + b)/3
color= makeColor(new,new,new)
setColor(p, color)
def restoreColor(pic):
for p in getPixels(pic):
setColor (p, makeColor(r1,g1,b1))
Run Code Online (Sandbox Code Playgroud)
它不起作用。 The error: "local or global name could not be found."
我明白为什么我会收到这个错误。
但是,如果我尝试在 restoreColor 中定义它们,它将给出灰度值。
我明白为什么我会收到这个错误,但不知道如何格式化我的代码,以保存名称值。我查看了有关局部和全局变量/名称的问题;但我无法在我学到的基本语法中弄清楚如何做到这一点。
问题是:
如何创建名称并获取原始(红色、绿色、蓝色)的值,然后我可以在另一个函数中使用它们?我尝试过的一切都返回了更改后的(灰度)值。谢谢
我正在尝试以 tiff 文件格式保存图像。我使用 libraw 从相机读取原始数据,它给了我未签名的短数据。我对数据做了一些操作,我想将结果保存为 Tiff 文件格式的 16 位灰度(1 通道)图像。但结果只是一个空白图像。即使我使用保留原始拜耳图像的缓冲区,它也不会正确保存。这是我用于保存的代码:
// Open the TIFF file
if((output_image = TIFFOpen("image.tiff", "w")) == NULL){
std::cerr << "Unable to write tif file: " << "image.tiff" << std::endl;
}
TIFFSetField(output_image, TIFFTAG_IMAGEWIDTH, width());
TIFFSetField(output_image, TIFFTAG_IMAGELENGTH, height());
TIFFSetField(output_image, TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField(output_image, TIFFTAG_BITSPERSAMPLE, 16);
TIFFSetField(output_image, TIFFTAG_ROWSPERSTRIP, 1);
TIFFSetField(output_image, TIFFTAG_ORIENTATION, (int)ORIENTATION_TOPLEFT);
TIFFSetField(output_image, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(output_image, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
TIFFSetField(output_image, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
// Write the information to the file
tsize_t image_s;
if( (image_s = TIFFWriteEncodedStrip(output_image, 0, &m_data_cropped[0], width()*height())) == -1)
{ …Run Code Online (Sandbox Code Playgroud) 我在将带有透明像素的彩色图像转换为灰度时遇到问题.我在这个网站上搜索并发现了相关的问题,但我没有用来解决我的问题.
我已经定义了一个方法"convertType",如下所示:
/*------------------------------
attempts to convert the type of the image argument to the chosen type
for example: BufferedImage newImage= ImageUtilities.convertType(oldImage, BufferedImage.TYPE_3BYTE_BGR);
11/28/2013 WARNING-it remains to be seen how well this method will work for various type conversions
------------------------------*/
public static BufferedImage convertType (BufferedImage image,int newType){
if (image.getType() == newType){
return (image);
}else {
int w= image.getWidth();
int h= image.getHeight ();
BufferedImage modifiedImage = new BufferedImage( w,h,newType);
Graphics2D g = ( Graphics2D)modifiedImage.getGraphics();
g.drawImage( image, null, 0,0);
g.dispose();
return (modifiedImage);
} …Run Code Online (Sandbox Code Playgroud) 我有一个灰度图像(实际上是"lena")我想试验一下.我把它作为512x512 PNG文件,有216种灰度.
当我用Java ImageIO阅读它时,会发生什么:
String name = args[0];
File fi = new File(name);
BufferedImage img = ImageIO.read(fi);
Run Code Online (Sandbox Code Playgroud)
我得到一个只有154种颜色的BufferedImage !我只是意识到这一点,导致我处理过的图像显得粗糙,缺乏深黑色.
更刺激的是,当我使用XnView将PNG转换为GIF时,在这种情况下这是一个无损程序,用上面的代码读取GIF,我在BufferedImage中得到所有216种颜色.
是否有某种文档或描述,当我的PNG读取它时会发生什么?有设置来解决这个问题吗?我在最近的JDK1.8上做过这些实验.只是我对Java PNG支持的信任现在已经丢失,我稍后会使用彩色PNG.
我想加载灰度图像的数据集。我使用过ImageFolder,但默认情况下不会加载灰色图像,因为它将图像转换为 RGB。
我找到了使用 ImageFolder 加载图像并在灰度转换图像后使用的解决方案:
transforms.Grayscale(num_output_channels=1)
Run Code Online (Sandbox Code Playgroud)
或者
ImageOps.grayscale(image)
Run Code Online (Sandbox Code Playgroud)
这是对的吗?如何在不进行转换的情况下加载灰度图像?我尝试了ImageDataBunch,但导入时遇到问题fastai.vision